【问题标题】:Regex to match if given text is not found and match as little as possible如果未找到给定文本并匹配尽可能少的正则表达式
【发布时间】:2016-11-29 08:17:41
【问题描述】:

我有文字:

<a>
sdfsdf
<b>DDzz</b>
sdfsdf
</a>
<a>
sdfsdf
<b>DDzz</b>
sdfsdf
</a>
<a>
sdfsdf
<b>BBzz</b>
sdfsdf
</a>
<a>
sdfsdf
<b>DDzz</b>
sdfsdf
</a>

我无法将其解析为 xml。我需要在这里使用正则表达式。这也只是例子。

我想要的正则表达式可以匹配每个不包含元素 b 的组 &lt;a&gt;...&lt;/a&gt; 与以 BB 开头的文本。

我想出了这个正则表达式: &lt;a&gt;.*?&lt;b&gt;(?!B).*?&lt;/b&gt;.*?&lt;/a&gt; 但它与最后一组匹配为:

<a>
sdfsdf
<b>BBzz</b>
sdfsdf
</a>
<a>
sdfsdf
<b>DDzz</b>
sdfsdf
</a>

这对我不利。

如何编写只匹配我给定示例中的那 3 个组的正则表达式?

1.

<a>
sdfsdf
<b>DDzz</b>
sdfsdf
</a>

2.

<a>
sdfsdf
<b>DDzz</b>
sdfsdf
</a>

3.

<a>
sdfsdf
<b>DDzz</b>
sdfsdf
</a>

【问题讨论】:

    标签: regex notepad++ regex-lookarounds


    【解决方案1】:

    使用tempered greedy token 正则表达式:

    <a>(?:(?!<(?:b>BB|/?a>)).)*</a>
    

    启用 . 匹配换行符 选项。

    详情

    • &lt;a&gt; - 文字 &lt;a&gt; 字符序列
    • (?:(?!&lt;(?:b&gt;BB|/?a&gt;)).)* - 与任何字符 (.) 匹配的缓和贪心令牌,它不是可以与 (?!&lt;(?:b&gt;BB|/?a&gt;)) 前瞻内的模式匹配的序列的起始符号(不是 &lt;b&gt;BB&lt;/a&gt; 或 @ 987654333@序列)
    • &lt;/a&gt; - 文字 &lt;/a&gt; 字符序列

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-18
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2021-01-12
      相关资源
      最近更新 更多