Конференция "Сети" » Как же выдрать нужный кусочем html кода. [D7, WinXP]
 
  • Lamer6666 (14.11.09 10:56) [20]
    Match и Replace не получается использовать одновременно, поэтому то и спрашивал как при переборе заменить найденные значения содержащиеся в Match[0]?
  • Медвежонок Пятачок © (14.11.09 17:17) [21]
    Найденное значение содежится в матче.
    Это тебе готовый новый экспрешшен для реплейса.
  • Медвежонок Пятачок © (14.11.09 19:46) [22]
    Ну или в конце концов у найденного матча есть матчпоз и матчлен.
  • Separator © (16.11.09 06:17) [23]
    Хернёй не страдайте, зачем давать бесполезные ответы, если человеку нужно определённое решение?

    Поищите в исходниках такую строку: TRegExprReplaceFunction
    Всё уже реализовано и можно реплайсить на динамическое значение
  • brother © (16.11.09 07:29) [24]
    добавлю одно но:
    все хорошо с заменой, если текст из [0] повторятся один раз, а если не один? ;)
    Вот еслиб

    > <table class="callstable"

    был бы уникальным и использовался один раз на странице (что врядли), вот тогда все гуд)
    зы делал подобное для сайта погоды... подводных камней - куча!
    Автору - удачи)
  • Медвежонок Пятачок © (16.11.09 09:07) [25]
    Поищите в исходниках такую строку: TRegExprReplaceFunction

    И чего?
    Чем она поможет, если ему все найденное надо приводить к дабл и умножать на два?
  • Separator © (23.11.09 06:50) [26]

    > Медвежонок Пятачок ©   (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
       { Private declarations }
     public
       function RegE(aRegExpr : TRegExpr): string;
     end;

    var
     Form8: TForm8;

    implementation

    {$R *.dfm}

    { TForm8 }

    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;

  • Separator © (23.11.09 07:01) [27]
    Вот честно, после всяких приведённых ответов на языке вертятся только неопределённые суффиксы: бля и мать вашу. Какого хрена не разобравшись даёте такие уверенные ответы? Исходники открыты, читайте, разбирайтесь и используйте.
  • Медвежонок Пятачок © (23.11.09 09:23) [28]
    Как видим задача решена полностью.

    не тормози, сникерсни.
    ему не просто найти надо, а заменить найденное на умноженное на два.
  • Медвежонок Пятачок © (23.11.09 09:32) [29]
    Допустим в исходном тексте есть '2' и '4'
    Обрабатываем '2' описанным выше образом и заменяем все го вхождения на '4'
    Затем встречаем в тексте '4', которое надо заменить на '8'.
    И тут понимаем, что кроме исходных '4' у нас появились '4' в результате предыдущего шага. А их менять не неадо.
  • Separator © (23.11.09 10:22) [30]
    Менять в обратном порядке: 4 на 8, 3 на 6, 2 на 4, 1 на 2, в чем проблема?
  • Медвежонок Пятачок © (23.11.09 10:28) [31]
    проблема в том, что порядок следования искомых чисел надо сначала где-т о взять
  • Separator © (23.11.09 10:40) [32]
    А где в постановке задачи были вообще такие условия? Может не стоит придумывать (додумывать) за автора вопроса? Я вроде написал, задача решена. В чём проблема? Подставте в мой пример рег. выражение данное автором и попробуйте запустить, уверяю вас, что всё отработает так как нужно и не будет ни каких левых замен.
    Давайте дождемся ответа автора вопроса? Если его не будет, значит он уже решил проблему, так что нечего плодить ответы.
  • Медвежонок Пятачок © (23.11.09 10:49) [33]
    А где в постановке задачи были вообще такие условия?

    Предлагаю, прежде чем петушиться и орать о найденном решении решении, подумать.

    А для начала найди в исходном тесте своим выражением самое большое число, с которого требутеся начать замену.
  • Медвежонок Пятачок © (23.11.09 10:56) [34]
    А где в постановке задачи были вообще такие условия?

    1.Выполняю запрос методом GET получаю в текстовую переменную

    2.как реализовать замену всех искомых сумм не на фиксированное значение '66.666', а на произведение например, то есть в место 0.001 получить везде 0.001*2?

    Итого: исходный текст заранее неизвестен.
    и в нем нужно искать числа и заменять их на функцию от найденного числа.

    Вот тебе и "а где в условии сказано"
  • Separator © (23.11.09 11:06) [35]
    Зачем искать самое большое число? Зачем производить множество замен? Функция 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;

  • Separator © (23.11.09 11:07) [36]
    Вместо умножения на 2 можно производить любые действия над данным числом
  • Медвежонок Пятачок © (23.11.09 11:41) [37]
    ну и как же ты на очередной итерации замены "4" на "16" ты отсечешь четверки, которые есть результат уже свершившейся замены двоек на четверки?
  • Separator © (23.11.09 11:43) [38]
    Какая очередная итерация? Все делается за один проход!!!
 
Конференция "Сети" » Как же выдрать нужный кусочем html кода. [D7, WinXP]
Есть новые Нет новых   [134439   +32][b:0][p:0.002]