.Net中的LookAhead Regex - 出乎意料的结果

时间:2010-03-17 10:41:04

标签: c# regex lookahead

我对我的正则表达式结果感到有些困惑(并且仍然试图理解我的语法)。我一直在使用http://regexpal.com/来测试我的表达,并且它的工作原理在那里,但是在C#中它并不像预期的那样。

这是一个测试 - 以下表达式:(?=<open>).*?(?=</open>)

在输入字符串上: <open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>

我希望得到<open>Text1 <open>Text 2 <open>Text 3...等的结果

但是,当我在C#中执行此操作时,它只返回<open>Text1

的第一个匹配项

如何从正则表达式中获取所有五个“结果”?

    Regex exx = new Regex("(?=<open>).*?(?=</open>)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    string input = "<open>Text 1</open> Text 2 <open> Text 3 </open> Text 4 <open> Text 5 </open>";
    string result = Regex.Match(input, exx.ToString(), exx.Options).ToString(); 

2 个答案:

答案 0 :(得分:1)

使用Regex.Matches代替Regex.Match

PS Home:> $s = '<open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>'
PS Home:> $re = '(?=<open>).*?(?=</open>)'
PS Home:> @([regex]::Match($s, $re)).Length
1
PS Home:> @([regex]::Matches($s, $re)).Length
3

正如Regex.Match所述的文档:

  

在输入字符串中搜索与正则表达式模式匹配的子字符串,并将第一个匹配项作为单个Match对象返回。

Regex.Matches

  

在输入字符串中搜索所有正则表达式,并返回所有成功匹配。

注意: 你在这里做的事情似乎非常错误。如果您正在处理的是XML或类似语言,请不要使用正则表达式来解析它。您将get mad otherwise使用嵌套结构。

答案 1 :(得分:0)

你真的想在每场比赛开始时都有<open>吗?为什么不使用lookbehind呢?

(?<=<open>).*?(?=</open>)