2010-03-17 90 views
1

我对我的正则表达式结果感到有点困惑(并且仍然试图让我的头部围绕语法)。我一直在使用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(); 
+0

我只看到三场比赛。 – Joey 2010-03-17 10:49:15

回答

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与嵌套结构。

+0

哇,这很简单,谢谢,让它工作! – AaronM 2010-03-17 10:50:26

+0

在这种情况下,你可以通过upvoting和接受约翰内斯的回答来改善业力(请参阅这篇文章旁边的向上三角形和复选框? – 2010-03-17 10:56:49

+0

我错过了匹配选项。感谢这个链接,我正在做一些基本的HTML解析/刮,没什么太复杂的(我认为...)我正在使用一个for循环和逐字节的字符串逐行扫描,但认为正则表达式会更好(它肯定少了很多代码!),我有一个好 – AaronM 2010-03-17 11:01:11

0

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

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

啊,好点。它在我使用的测试数据中看起来很糟糕,但我解析开始标签的真实数据可能会有所帮助。不过谢谢,Regex对我来说都是新手,但需要一点时间才能习惯。现在Johannes给了我别的东西来看看! – AaronM 2010-03-17 11:12:08