奇怪的行为delphi X5中的正则表达式

时间:2014-01-25 06:28:29

标签: regex delphi

我正在尝试提取表单中的文字:

1.树上只有青苹果。

一个。这个人就是男孩。

湾这个人是个骗子。

2.汽车开得非常快。

一个。它是由一个疯子驱动的。

湾这是一个小女孩。

我想要" 1.树只有青苹果。"所有段落的一部分。 我的结果列表应包含" 1.树只有青苹果。","  汽车开得非常快" ...我写了一个正则表达式" \ d {1,2}。\ s(。+?\ n \ n |。+?$)&#34 ;并在各种引擎上进行测试并且有效。我不明白为什么这在delphi xe 5中不起作用。

以下是我使用它的代码:

procedure TForm1.btSearch;
var
  regex: TRegEx;
  i, j: integer;
  mygrps: TGroupCollection;
begin
  regex:= TRegEx.Create(edit1.text);

  mycoll:= regex.Matches(memo1.text);
  if mycoll.Count>0 then
  begin
  label2.caption:= 'Count: ' + IntToStr(mycoll.Count);
      memo2.Lines.Add('First Collection: ');
      for i := 0 to mycoll.Count-1 do
      begin
      memo2.Lines.Add('Match #' + IntToStr(i) + ': ' + mycoll.Item[i].Value);
      memo2.Lines.Add('Group: ' + IntToStr(i));
      mygrps:= mycoll.Item[i].Groups;
           for j := 0 to mygrps.Count-1 do
           begin
           memo2.Lines.Add('Value: ' + mygrps.Item[j].Value);
           end;
      end;
  end;
end;

enter image description here

2 个答案:

答案 0 :(得分:3)

这与Delphi毫无关系。您的正则表达式似乎不正确。它与我能找到的任何引擎中提供的文本都不匹配。

给出以下文字(来自您的样本,格式正确):

1. The tree has only green apples.

a. the person is boy.

b. the person is a liar.

2. The car drove very fast

a. it was driven by a mad man.

b. it was by a little girl. 

以下正则表达式匹配您指定为所需结果的两行(在JGSoft,.NET,PCRE,Java,Perl,JavaScript,XMLSchema,XPath和Perl引擎中测试):

\d{1,2}\.\s.*

Screen image of RegexBuddy with above regex and output

答案 1 :(得分:2)

当您使用“各种引擎”进行测试时,您没有考虑到各种应用程序和编程语言以不同方式处理换行符。在Delphi中,TMemo.Text返回带有CRLF换行符的字符串。要在Delphi中匹配一个这样的换行符,您需要正则表达式\r\n