.Net中的LookAhead正则表达式 - 意想不到的结果
我对我的正则表达式结果感到有点困惑(并且仍然试图让我的头部围绕语法)。我一直在使用http://regexpal.com/来测试我的表达,以及它在那里的工作,但是在C#中它并不如预期。.Net中的LookAhead正则表达式 - 意想不到的结果
下面是测试 - 下面的表达式:(?=<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();
使用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与嵌套结构。
你真的想在每场比赛开始时有<open>
吗?为什么不使用后视?
(?<=<open>).*?(?=</open>)
啊,好点。它在我使用的测试数据中看起来很糟糕,但我解析开始标签的真实数据可能会有所帮助。不过谢谢,Regex对我来说都是新手,但需要一点时间才能习惯。现在Johannes给了我别的东西来看看! – AaronM 2010-03-17 11:12:08
我只看到三场比赛。 – Joey 2010-03-17 10:49:15