【问题标题】:Why does this regex not capture anything?为什么这个正则表达式不捕获任何东西?
【发布时间】:2015-05-23 05:50:00
【问题描述】:

我知道,我应该使用 htmlAgilityPack - 但就我而言,我没有任何机会这样做......悲伤但真实......
我们有以下正则表达式:<a(.+?)(href=["|'](.+?)["|'])(.+?)>(.+?)</a> 和以下示例输入:

<A href="
http://dummy.domain/dummy.html
" target="_blank"><b><font face="Arial" color="#0000FF" size="2">
Dummy text
</font></b></a>

如果我删除组内的换行符,一切正常。我正在使用ignore-case-option 在.net c# 上运行它。

. 没有捕获任何\r\n-things 吗?

【问题讨论】:

  • @John:你应该回答(接受),或者加入我的close :)

标签: c# regex


【解决方案1】:

我猜你在字符类中放置了管道符号来表示“或”——如果是这种情况,请移除管道,[] 表示其任何成员的“或”。

另外,请记住,\n 在 HTML 中的任何位置都可能存在,而“.”不会捕捉到那些字符(它会捕捉到\r)。

要匹配换行符,您需要使用 SingleLine 选项,或将 . 更改为 [.\n][\s\S] 等替代选项来代替普通的 .。这是一个内联指定单行模式的示例:

(?s)<a(.+?)(href=["'](.+?)["'])([^>]*)>(.+?)</a>

还要注意这里使用的[^&gt;]*,它比使用非贪婪匹配要简单一些。

【讨论】:

  • 好吧,实际上确实如此......正则表达式是正确的,但我必须使用singleline-选项来捕捉\n...
  • 没错!我的错。编辑以包含有关空格和“。”的详细信息
【解决方案2】:

如果你只是想选择标签之间的所有内容,试试这个

<a\b[^>]*>([\s\S.]*?)</a>

【讨论】:

  • 实际上,我并没有在这里进行愚蠢的选择:) ...这些组需要保持原样。对不起...
  • 需要注意的一点:与. 相比,[\s\S] 的执行时间真的很糟糕 :)
  • 它很难看,\S = 选择除空白之外的所有内容 \s = 空白,从内存中丢失,所以可能不是最佳选择,但它确实抓住了一切:)
【解决方案3】:

如果我没记错的话,.匹配除换行符以外的任何字符。

【讨论】:

  • 其实我也猜到了...如果您添加解决方案,我想勾选您的答案为正确!
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2022-06-15
  • 2016-06-04
  • 2016-03-04
  • 1970-01-01
相关资源
最近更新 更多