Delphi - RegExp (Регулярные выражения)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by mailbrush, 6 May 2009.

  1. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Либо я что-то не так делаю, либо TRegExpr криво пашет. Есть HTML-страничка. Пытаюсь вывести все ссылки
    Code:
    RegExp1.Expression:='<a href=(.*) .*>';
    При выводе
    Code:
    RegExp1.Match[0]
    - выводит криво, а т.е. весь документ.
    Code:
    RegExp1.Match[1]
    Так пусто. Посоветуйте как решить эту траблу, или норм. компоннент для регулярок в дельфи.
     
    #1 mailbrush, 6 May 2009
    Last edited: 6 May 2009
  2. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    http://forum.vingrad.ru/articles/topic-213075.html
     
  3. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Ну тыкнул ты ссылку, и что? Синтаксис регулярок я знаю. Эту же регулярку применил в PHP - все заработало. Тут - нету. Нечего сказать - промолчи!
     
  4. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    Code:
    const
      EmailRE = '<title>(.*)</title>';
    var
    code,tmp,html:string;
    r : TRegExpr;
    begin
    html:='<title>епт</title>';
    r := TRegExpr.Create;
    try
         r.Expression := EmailRE;
         if r.Exec () then
          REPEAT
           tmp:=r.Match [1];
           code := code + tmp;
          UNTIL not r.ExecNext;
        finally r.Free;
       end;
    ShowMessage(code);
    
     
    6 people like this.
  5. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    Hormold, думаш в файле много title'ов? )
     
  6. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    Code:
    var RegExp : TRegExpr;
        input : string;
    begin
     input := 'Memo1<a href="http://abc.def">nana</a>sabd<a href="http://aaabc.def">nangga</a>as';
     RegExp := TRegExpr.Create;
    
     RegExp.Expression := '<a href="(.+?)">(.+?)</a>';
     if RegExp.Exec(input) then
          repeat
            showmessage('Name: '+RegExp.Match[2]+#13#10+
                        'Url:  '+RegExp.Match[1]);
          until not RegExp.ExecNext;
     
    2 people like this.
  7. /^scriptor$/

    /^scriptor$/ New Member

    Joined:
    11 Apr 2009
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    вот так привильно:
    Code:
    RegExp1.Expression:='<a href=(.?*) .*>';
     
  8. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    ололо
     
  9. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    В силу того, что сайт http://regexpstudio.com/ сейчас по каким-то причинам в дауне, прошу поделиться тем, что было тут http://regexpstudio.com/downloads/regexpr_ru.zip
    В большей степени интересует документация, сам компонент я нашёл..)
     
  10. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Не знаю, то ли ты ищешь, или нет, но вот возьми этот Help файл. В нем описаны основные принципы работы с компонентом и примеры регулярных выражений.
    Code:
    http://rapidshare.com/files/283957681/Help.rar.html
     
    1 person likes this.
  11. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Code:
          RegExp := TRegExpr.Create;
          HTMLStr :=  'шлак ыврафып<title>ололо!!!!!11</title>шлак фываыв';
          RegExp.Expression := '<title>(.+?)</title>';
          RegExp.Exec(HTMLStr);
          ShowMessage(RegExp.Match[0]);
    Выаёт результат <title>ололо!!!!!11</title> (вместе с тегами тайтла)
    Пробовал разные комбинации (.+?), (.+), (.*?), (.*) - безрезультатно... :confused:
    Как вытащить без тайтлов..?! :rolleyes:
     
  12. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    У тебя правильно составлена регулярка. Наверное нужно делать:
    Code:
    ShowMessage(RegExp.Match[1]);
     
  13. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    :eek: Вот блин.. Так и есть...
    Не понимаю, а зачем он в RegExp.Match[0] это пихает.. :confused:
     
  14. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Народ скиньте компонент RegExp для делфи пожалуйста! (ссылки в теме битые, а в гугле нету)
     
    #14 wolmer, 29 Sep 2009
    Last edited: 11 May 2010
  15. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    http://www.delphisources.ru/files/sources/raznoe/2007_year/regexp_debugger.zip
    Там в архиве файл RegExpr.pas как раз и есть этот компонент..)