我希望匹配foo:12345格式的所有文本,这些文本不包含在HTML锚中。例如,我希望匹配以下代码中的第1行和第3行:
foo:123456
<a href="http://www.google.com">foo:123456</a>
foo:123456
我已经尝试了这些正则表达式,但没有成功:
负向先行尝试(不正确匹配,但不包括最后一位)
foo:(\d+)(?!</a>)
使用非捕获分组的负面先行
(?:foo:(\d+))(?!</a>)
负向回看尝试(通配符似乎不受支持)
(?<!<a[^>]>)foo:(\d+)
发布于 2012-01-05 02:09:02
正则表达式通常不是最适合这项工作的工具,但如果您的情况非常具体,如示例中所示,您可以使用:
foo:((?>\d+))(?!</a>)您的第一个表达式不起作用,因为在(?!</a>)匹配之前,\d+会回溯。这可以通过不允许\d+回溯来修复,就像上面在原子/非回溯组的帮助下一样,或者您也可以在\d+回溯的情况下使前视失败,例如:
foo:((?>\d+))(?!</a>|\d)尽管这并不是那么有效。
发布于 2012-01-05 02:11:46
如果您想像这样开始分析HTML,那么您可能希望实际解析HTML,而不是使用正则表达式。HTML Agility Pack通常是第一个停靠的端口。使用正则表达式,很难处理像<a></a>foo:123456<a></a>这样的东西,它当然应该去掉中间的部分,但编写一个能做到这一点的正则表达式是极其困难的。
我应该补充的是,我假设您确实有一块HTML,而不仅仅是像上面的每一行这样的单独的短字符串。我排除了它的部分原因是,如果它是唯一的东西,那么匹配它是相当容易的,所以我想如果你想要它,你就会得到它。:)
发布于 2012-01-05 02:09:57
请注意,对于不同的字符串长度,lookbehind将不起作用,您可能会以不同的方式解决它
例如
实现您的目标
https://stackoverflow.com/questions/8731662
复制相似问题