【问题标题】:Regex get all matches including smaller submatches正则表达式获取所有匹配项,包括较小的子匹配项
【发布时间】:2014-07-15 05:42:24
【问题描述】:

我有以下输入字符串

Testing <B><I>bold italic</I></B> text. 

以及以下正则表达式:

<([A-Z][A-Z0-9]*)\b[^>]*>.*</\1>

这个正则表达式只给出以下更大的匹配

<B><I>bold italic</I></B>

如何使用正则表达式来获得较小的匹配?

<I>bold italic</I>

我尝试使用非贪心运算符,但也没有用。

是否可以使用 java 或 c# 匹配组或匹配集合作为匹配组?

【问题讨论】:

    标签: regex non-greedy


    【解决方案1】:

    试试下面的正则表达式,它使用正向回溯,

    (?<=>)<([A-Z][A-Z0-9]*)\b[^>]*>.*<\/\1>
    

    DEMO

    它会查找紧跟在&gt; 符号之后的标签。

    说明:

    • (?&lt;=&gt;) 此处使用正向后视,它将匹配标记设置在 &gt; 符号之后。
    • &lt; 文字 &lt; 符号。
    • ([A-Z][A-Z0-9]*\b[^&gt;]*&gt;) 捕获到下一个 &gt; 符号。
    • .* 匹配除\n 之外的任何字符零次或多次。
    • &lt;\/\1&gt;匹配空位&lt;/+第一个捕获组+&gt;

    【讨论】:

    • 是否可以使用单个正则表达式遍历两个匹配项?使用任何编程语言。
    • 是的。大多数编程语言都支持lookbehind。在 java 中,您需要再次转义反斜杠,因为该模式被双引号而不是正斜杠包围。
    • 我试图在 c# 中获取所有匹配项,但它只返回了较小的匹配项。是否可以一一获得两场比赛?如果你能告诉我java/C#代码,那就太好了。
    • 在此链接regex101.com/r/wI6fK3/3 中发布输入并保存正则表达式。然后在这里发回链接。之后,解释你想在那个输入上匹配什么。然后我会给你看c#代码。
    【解决方案2】:

    您可能知道,许多人更喜欢使用 DOM 解析器来解析 html。但看看你现有的正则表达式,要修复它,我建议这样做:

    <([A-Z][A-Z0-9]*)\b[^<>]*>[^<]*</\1>
    

    the demo

    说明

    • 在标签内部,在匹配太多字符的.* 内部,我们使用[^&lt;]*,它匹配任何不是开始标签的字符。这样我们就不会进入另一个标签。
    • 同样,我将您的 [^&gt;]* 更改为 [^&lt;&gt;]*,因此我们不会开始另一个标签
    • 我假设你会让这个不区分大小写

    【讨论】:

    • 仅供参考,添加了演示和解释。 :)
    • 谢谢,它正在工作。顺便说一句,我这样做不是为了解析 HTML,我这样做只是为了学习正则表达式。
    猜你喜欢
    • 2013-05-09
    • 2016-11-04
    • 2021-10-12
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多