代码之家  ›  专栏  ›  技术社区  ›  LaurentG Sherbrow

如何使正则表达式捕捉最短的匹配元素?[重复]

  •  0
  • LaurentG Sherbrow  · 技术社区  · 4 年前

    我需要关于正则表达式与非贪婪选项匹配的帮助。

    匹配模式是:

    <img\s.*>
    

    要匹配的文本是:

    <html>
    <img src="test">
    abc
    <img
      src="a" src='a' a=b>
    </html>
    

    我测试 http://regexpal.com

    此表达式匹配来自的所有文本 <img 持续 > .我需要它来匹配第一次遇到的 > 在最初的 <img 所以在这里,我需要得到两个匹配项,而不是我得到的一个。

    我尝试了所有的 非贪婪 ? ,但没有成功。

    0 回复  |  直到 9 年前
        1
  •  616
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    非贪婪者 ? 很好用。只是你需要选择 点匹配所有 regex引擎中的选项( 正则表达式 ,您使用的引擎也有此选项)您正在测试。这是因为,正则表达式引擎在使用时通常不匹配换行符 . .你需要明确地告诉他们,你也希望与换行符匹配 .

    例如

    <img\s.*?>
    

    很好!

    检查 results here .

    另外,请阅读 how dot behaves 各种regex口味。

        2
  •  119
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    这个 ? 操作数使匹配不贪婪。例如。 .* 贪心 .*? 不是,所以你可以用 <img.*?> 匹配整个标签。或 <img[^>]*> .

    但是请记住,整个HTML集合实际上不能用正则表达式进行解析。

        3
  •  24
  •   tripleee    6 年前

    这里的其他答案假定您有一个支持非贪婪匹配的正则表达式引擎,它是Perl 5中引入的一个扩展,并广泛复制到其他现代语言中;但它绝不是无处不在的。

    许多更古老或更保守的语言和编辑器只支持传统的正则表达式,而这些正则表达式没有控制重复运算符贪婪性的机制 * -它总是匹配尽可能长的字符串。

    然后,诀窍是限制它首先允许匹配的内容。而不是 .* 你好像在找

    [^>]*
    

    这仍然和我们的 某物 尽可能地;但是 某物 不只是 . “任何角色”,而是“任何不是的角色” > ".

    根据应用程序的不同,您可能希望也可能不希望启用允许“任何字符”包含换行符的选项。

    即使您的正则表达式引擎支持非贪婪匹配,也最好详细说明您的实际意思。如果这 你的意思是,你可能应该这么说,而不是依靠非贪婪匹配(希望,可能)来实现我的意思。

    例如,在通配符后面有尾随上下文的正则表达式 .*?><br/> 将跳过任何嵌套的 > 直到找到尾随上下文(这里, ><br/> )即使这需要跨越多个领域 > 实例和换行符如果你愿意,在哪里 [^>]*><br/> (甚至 [^\n>]*><br/> 如果你必须明确禁止新行),显然不能也不会这么做。

    当然,如果你需要应对,这仍然不是你想要的 <img title="quoted string with > in it" src="other attributes"> and perhaps <img title="nested tags"> ,但在这一点上,你应该最终放弃使用正则表达式,就像我们一开始就告诉你的那样。