首页 > 解决方案 > 搜索书籍名称的正则表达式 (Delphi 7 & DiRegEx 8.8.1)

问题描述

我正在使用 Delphi 7,这是我第一次使用库 DiRegEx。我需要做的是收集列表中书籍的名称。该列表很长,但要知道它看起来像这样:

2 Tesalonickým 3:14 2 Tesalonickým 3:15 2 Tesalonickým 3:16 2 Tesalonickým 3:17 2 Tesalonickým 3:18 1 Timoteovi 1:1 1 Timoteovi 1:2 1 Timoteovi 1:3 1 Timoteovi 1:4

所以我想通过 RegEx.Match 找到的是“2 Tesalonickým”和“1 Timoteovi”字符串。所以我想搜索^some string\d\d?\d?:\d\d?\d?...

我的代码是:

var
  contents : TStringList;

  RegEx: TDIRegEx;
  WordCount: Integer;

  s:string;

begin

Contents := TStringList.Create;
RegEx := TDIPerlRegEx.Create{$IFNDEF DI_No_RegEx_Component}(nil){$ENDIF};

Contents.LoadFromFile('..\reference dlouhé CS.txt');
for i:=0 to Contents.count-1 do
  begin
    Contents[i];
    try
      RegEx.SetSubjectStr(Contents[i]);
      RegEx.MatchPattern := '\w+';
      WordCount := 0;
      if RegEx.Match(0) >= 0 then
        begin

          repeat
            Inc(WordCount);
            s := RegEx.MatchedStr;
            WriteLn(WordCount, ' - ', s);
          until RegEx.MatchNext < 0;
        end;
    finally
      RegEx.Free;
    end; // end try
  end; // end for
  end;

而且我需要修改正则表达式,因此\d\d?\d?:\d\d?\d?不会出现在结果中,而应该是“锚”或“针”。如何制作正则表达式?

结果:

这是 UTF-8 格式的 66 本书的完整列表。\w 模式存在一些问题,因为它不包括像 Ž 或 š 这样的字符。

创世纪;出埃及记;利未记;Numeri;氘代;Jozue;Soudců;Rút;1 Samuelova;2 Samuelova;1 Královská;2 Královská;1 Paralipomenon;2 Paralipomenon;Ezdráš;Nehemjáš;Ester;Jób;Žalmy;Přísloví;Kazatel;Píseň písní ;Izajáš;Jeremjáš;Pláč;Ezechiel;Daniel;Ozeáš;Jóel;Ámos;Abdijáš;Jonáš;Micheáš;Nahum;Abakuk;Sofonjáš;Ageus;Zacharjáš;Malachiáš;Matouš;Marek;Lukáš;Jan;Skutky apoštolské;Řmímanům ;2 Korintským;Galatským;Efezským;Filipským;Koloským;1 Tesalonickým;2 Tesalonickým;1 Timoteovi;2 Timoteovi;Titovi;Filemonovi;Židům;Jakubův;1 Petrův;2 Petrův;1 Janův;2 Janův;3 Janův;Judjevenův;亚诺沃;

标签: regexdelphi

解决方案


您可以使用

(*UCP)^(?:\d+\s+)?\w+(?=\s+\d\d?\d?:\d)

或者

(*UCP)^(?:\d+\s+)?\w+(?=\s+\d{1,3}:\d)

模式开始处的A (*UCP)(PCRE 动词)使所有速记都可以识别 Unicode。

模式匹配

  • ^ - 字符串的开头
  • (?:- 非捕获组的开始
    • \d+- 1+位数,
    • \s+- 1+空格和
  • )?- 非捕获组结束,1 或 0 次出现(?使其可选)
  • \w+- 1+字字符...
  • (?=\s+\d{1,3}:\d)- 后跟 1+ 个空格、1 到 3 位数字:和一个数字。

请参阅正则表达式演示

如果您只需要匹配字母,则\w可能需要替换为。\p{L}


推荐阅读