【问题标题】:.NET negative lookbehind regex not working as expected.NET 负后向正则表达式未按预期工作
【发布时间】:2015-06-03 18:47:01
【问题描述】:

我想隔离字符串中的首字母“Wrs”

"agendapunt 5.4 (GAIA) asdf <BR>    Wrs    <BR>         medegedeeld"

这是我正在使用的正则表达式:

(?<!<BR>)(\s{2,}[a-z]+\s{2,})(?=<BR>)

首字母“Wrs”必须后跟至少两个空格,然后是 html 分隔符 &lt;BR&gt;。 此外,首字母“Wrs”必须以至少两个空格开头,并且不能以 HTML &lt;BR&gt; 标记开头。

不幸的是,在上面的示例中,首字母仍然存在正匹配,即使前面有 &lt;BR&gt; 标记。 我不明白为什么,因为积极的前瞻似乎确实像我预期的那样工作。 IE。当我从输入字符串中删除第二个 &lt;BR&gt; 标记或其中的一部分时,找不到匹配项。

另外,我尝试使用积极的后视而不是消极的,只是为了看看它会做什么,它也完全按照我的预期工作。 在这种情况下,正面和负面的环视似乎不符合相同的规则。

知道我做错了什么吗?

【问题讨论】:

  • 这个正则表达式能隔离 Wrs 吗? &lt;BR&gt;\s*(.*?)\s*&lt;BR&gt;
  • 如果您查看匹配的值可能会很有启发性。我猜它只匹配Wrs 之前的三个 空格,而不是全部四个。实际上,这三个空格前面没有&lt;BR&gt;,因此它们满足您的正则表达式。负向回溯很棘手。

标签: .net regex negative-lookbehind


【解决方案1】:

您正在寻找的正则表达式是

(?<!<BR>\s{2,})(?<=\s{2,})([a-z]+)(?=\s{2,}<BR>)

带有IgnoreCase 选项。

原因是我们也必须匹配空格,如果它们被允许,在不允许的&lt;BR&gt; 之后。 Lookbehinds 不消耗文本,因此,在look-behind 中,我们需要在第一个消耗的字符之前检查所有前面的字符。

我希望现在更清楚了。

example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多