【问题标题】:LookAhead Regex in .Net - unexpected result.Net 中的 LookAhead Regex - 意外结果
【发布时间】:2010-03-17 10:41:04
【问题描述】:

我对我的正则表达式结果有点困惑(并且仍在尝试理解语法)。我一直在使用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 中获取所有五个“结果”?

    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(); 

【问题讨论】:

  • 我只看到三个匹配项。

标签: c# regex lookahead


【解决方案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

【讨论】:

  • 在这种情况下,您可以通过投票和接受 Johannes 的回答来改善您的业力(请参阅本文旁边的上三角和复选框?
  • 我错过了匹配选项。也感谢那个链接,我正在做一些基本的 HTML 解析/抓取,没什么太复杂的(我认为......)我正在使用 for 循环并逐字节浏览字符串,但认为 Regex 会更好(它的代码肯定少了很多!),不过我会好好阅读这个问题。
  • 我可以接受答案(感谢您将我指向该地点,我正在寻找一些可点击的文字,而不是图像!),但除非我成为会员,否则我无法投票:(
  • @Aaron:对于 HTML 抓取,您可以使用 HTML Agility Pack (codeplex.com/htmlagilitypack),它应该比使用正则表达式更强大。
  • @Aaron:还有两个代表点,你就可以投票了 :)
【解决方案2】:

你真的想在每场比赛开始时都有&lt;open&gt;吗?为什么不也使用lookbehind?

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

【讨论】:

  • 啊,好点子。我使用的测试数据看起来很糟糕,但我解析开始标签的真实数据可能会有所帮助。不过谢谢,Regex 对我来说是全新的,但需要一点时间来适应。现在,Johannes 也给了我一些别的东西来看看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多