假设我有一个标签<tag>
,我想在我的字符串中匹配<tag>...<tag>
组。我可以沿着<tag>.*<tag>
的方向使用正则表达式。这匹配<tag>foo<tag>
,这很好,但它也匹配<tag>foo<tag>bar<tag>
,这是我不想要的行为。我想要<tag>foo<tag>
匹配,然后bar
被排除,然后标记结束成为下一个匹配的开始。我该怎么做呢?红宝石正则表达式 - 防止重叠匹配
0
A
回答
4
最简单的解决方法是使用一个懒惰的quantifier其中?
迫使.*
为几个字符地匹配(而不是多,尽可能缦.*
将尝试匹配):
<tag>.*?<tag>
一个更安全,更明确的解决方案是使用一个negative lookahead assertion:
<tag>(?:(?!<tag>).)*<tag>
虽然在目前的情况下,在行为上没有差异,第二个是扩展处理打开/关闭标签,确保嵌套的标签不匹配错误:
<tag>(?:(?!</?tag>).)*</tag>
当应用于<tag>foo<tag>bar</tag>baz</tag>
会匹配<tag>bar</tag>
,而不是<tag>foo<tag>bar</tag>
作为一个懒惰量词的解决方案。
+2
你能解释一下是什么让它“更安全”吗? – Kvass
2
相关问题
- 1. 正则表达式匹配红宝石
- 2. 正则表达式匹配红宝石
- 3. 红宝石正则表达式 - 需要更换正则表达式匹配
- 4. 红宝石正则表达式返回
- 5. 红宝石正则表达式HH:MM
- 6. 干红宝石正则表达式?
- 7. 红宝石多行正则表达式
- 8. 红宝石:了解正则表达式
- 9. 匹配换行符`\ N`在红宝石的正则表达式
- 10. 红宝石:不兼容的编码正则表达式匹配
- 11. 红宝石:与正则表达式匹配的分隔符
- 12. 红宝石正则表达式匹配分¢
- 13. 匹配的正则表达式的红宝石
- 14. 在红宝石混淆中匹配正则表达式
- 15. (红宝石)帮助匹配我的正则表达式
- 16. 红宝石正则表达式:匹配并获得
- 17. 红宝石正则表达式找到匹配嵌套
- 18. 正则表达式匹配的红宝石
- 19. 红宝石正则表达式:如果匹配子不存在
- 20. 空的正则表达式匹配红宝石是什么?
- 21. 红宝石单线捕捉正则表达式匹配
- 22. 红宝石正则表达式匹配,除非逃脱\
- 23. 红宝石用正则表达式匹配可选
- 24. 红宝石正则表达式 - 这与#
- 25. 重叠正则表达式匹配
- 26. 红宝石正则表达式匹配括号中的子表达式
- 27. 红宝石正则表达式挂
- 28. 正则表达式和红宝石
- 29. 使用正则表达式/红宝石
- 30. 红宝石,真/假正则表达式
你有任何HTML字符串? –
这不一定是HTML - “”可以代替任何序列。 –
Kvass
任何重复序列都会很快显示出使用正则表达式的缺点,而且您调整避免碰撞/重叠的模式的工作将会天壤之寒。 *如果你正在使用HTML或XML,不要打扰正则表达式,如果你的需求超出了微不足道的用途。相反,使用像Nokogiri这样的解析器。你的大脑稍后会感谢你。 –