-
Match и Replace не получается использовать одновременно, поэтому то и спрашивал как при переборе заменить найденные значения содержащиеся в Match[0]?
-
Найденное значение содежится в матче. Это тебе готовый новый экспрешшен для реплейса.
-
Ну или в конце концов у найденного матча есть матчпоз и матчлен.
-
Хернёй не страдайте, зачем давать бесполезные ответы, если человеку нужно определённое решение?
Поищите в исходниках такую строку: TRegExprReplaceFunction Всё уже реализовано и можно реплайсить на динамическое значение
-
добавлю одно но: все хорошо с заменой, если текст из [0] повторятся один раз, а если не один? ;) Вот еслиб
> <table class="callstable"
был бы уникальным и использовался один раз на странице (что врядли), вот тогда все гуд) зы делал подобное для сайта погоды... подводных камней - куча! Автору - удачи)
-
Поищите в исходниках такую строку: TRegExprReplaceFunction
И чего? Чем она поможет, если ему все найденное надо приводить к дабл и умножать на два?
-
> Медвежонок Пятачок © (16.11.09 09:07) [25] > > И чего?
А может стоило всё-таки разобраться? Вот исходная строка: n1sad n2dsa n3ds n4sd n5asВот регулярное выражение: (n)([\d]+)А вот результат: n2sad n4dsa n6ds n8sd n10asКак видим задача решена полностью. Код решения:
type
TForm8 = class(TForm)
btn1: TButton;
mmo1: TMemo;
edt1: TEdit;
mmo2: TMemo;
procedure btn1Click(Sender: TObject);
private
public
function RegE(aRegExpr : TRegExpr): string;
end;
var
Form8: TForm8;
implementation
procedure TForm8.btn1Click(Sender: TObject);
var
mRegE: TRegExpr;
begin
mRegE := TRegExpr.Create;
try
mRegE.Expression := edt1.Text;
mmo2.Lines.Add(mRegE.ReplaceEx(mmo1.Lines.Text, RegE));
finally
mRegE.Free;
end;
end;
function TForm8.RegE(aRegExpr: TRegExpr): string;
begin
Result := aRegExpr.Match[1] + FloatToStr(StrToFloatDef(aRegExpr.Match[2], 0) * 2);
end;
-
Вот честно, после всяких приведённых ответов на языке вертятся только неопределённые суффиксы: бля и мать вашу. Какого хрена не разобравшись даёте такие уверенные ответы? Исходники открыты, читайте, разбирайтесь и используйте.
-
Как видим задача решена полностью.
не тормози, сникерсни. ему не просто найти надо, а заменить найденное на умноженное на два.
-
Допустим в исходном тексте есть '2' и '4' Обрабатываем '2' описанным выше образом и заменяем все го вхождения на '4' Затем встречаем в тексте '4', которое надо заменить на '8'. И тут понимаем, что кроме исходных '4' у нас появились '4' в результате предыдущего шага. А их менять не неадо.
-
Менять в обратном порядке: 4 на 8, 3 на 6, 2 на 4, 1 на 2, в чем проблема?
-
проблема в том, что порядок следования искомых чисел надо сначала где-т о взять
-
А где в постановке задачи были вообще такие условия? Может не стоит придумывать (додумывать) за автора вопроса? Я вроде написал, задача решена. В чём проблема? Подставте в мой пример рег. выражение данное автором и попробуйте запустить, уверяю вас, что всё отработает так как нужно и не будет ни каких левых замен. Давайте дождемся ответа автора вопроса? Если его не будет, значит он уже решил проблему, так что нечего плодить ответы.
-
А где в постановке задачи были вообще такие условия?
Предлагаю, прежде чем петушиться и орать о найденном решении решении, подумать.
А для начала найди в исходном тесте своим выражением самое большое число, с которого требутеся начать замену.
-
А где в постановке задачи были вообще такие условия?
1.Выполняю запрос методом GET получаю в текстовую переменную
2.как реализовать замену всех искомых сумм не на фиксированное значение '66.666', а на произведение например, то есть в место 0.001 получить везде 0.001*2?
Итого: исходный текст заранее неизвестен. и в нем нужно искать числа и заменять их на функцию от найденного числа.
Вот тебе и "а где в условии сказано"
-
Зачем искать самое большое число? Зачем производить множество замен? Функция ReplaceEx позволяет работать над каждым найденным значением отдельно и она продолжит искать по исходной строке, которая не подвергнется изменениям, пока не будет закончена вся замена, если заглянете в реализацию ReplcaeEx, то заметите, что там не производятся замены над исходной строкой, а результатом будет простое объединение не попадающих под выражение частей строки и результатов переданной функции. Вот ещё раз привожу пример работы: исходная строка, куча цифр: 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 9 регулярное выражение: ([\d]+) результат, каждое найденное число умножено на 2: 20 22 24 26 28 30 32 34 36 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 2 4 6 8 10 12 14 16 18 Никаких коллизий не обнаружено, каждое число как ему и полагалось, умножено на 2. Что еще требуется? вот код:
procedure TForm8.btn1Click(Sender: TObject);
var
mRegE: TRegExpr;
begin
mRegE := TRegExpr.Create;
try
mRegE.Expression := edt1.Text;
mmo2.Lines.Add(mRegE.ReplaceEx(mmo1.Lines.Text, RegE));
finally
mRegE.Free;
end;
end;
function TForm8.RegE(aRegExpr: TRegExpr): string;
begin
Result := FloatToStr(StrToFloatDef(aRegExpr.Match[0], 0) * 2);
end;
-
Вместо умножения на 2 можно производить любые действия над данным числом
-
ну и как же ты на очередной итерации замены "4" на "16" ты отсечешь четверки, которые есть результат уже свершившейся замены двоек на четверки?
-
Какая очередная итерация? Все делается за один проход!!!
|