【问题标题】:regex look ahead behind (look around) negative problems正则表达式向前看(环顾四周)负面问题
【发布时间】:2018-06-29 15:30:04
【问题描述】:

我无法理解负正则表达式前瞻/后瞻。我从阅读教程中得到的印象是,当您设置要查找的条件时,该条件不构成搜索匹配的一部分。

这似乎适用于我尝试过的正面前瞻示例,但是当我尝试这些负面示例时,它与整个测试字符串匹配。 1,它不应该匹配任何东西,2即使匹配,也不应该包含前瞻条件??

(?<!^And).*\.txt$

有输入

And.txt

见:https://regex101.com/r/vW0aXS/1

^A.*(?!\.txt$)

有输入:

A.txt

见:https://regex101.com/r/70yeED/1

PS:如果你要问我是哪种语言。我不知道。我们被告知要使用正则表达式,而无需具体提及任何特定语言。我尝试在 regex101.com 上单击各种选项,结果都一样。

【问题讨论】:

  • 在字符串的开头,lookbehind 不能“look back”看到“AND”。相反,在字符串的末尾,前瞻不会看到“.txt”,因为它已经匹配了。

标签: regex regex-lookarounds


【解决方案1】:

lookarounds 仅尝试在其当前位置匹配。

您在字符串(?&lt;!^And).*\.txt$开始 处使用后向查找,在字符串^A.*(?!\.txt$)结束 处使用前瞻,这不起作用. (.* 将始终在第一次匹配时消耗整个字符串)

例如,要禁止“And”,您可以在字符串的开头加上一个贪婪的量词.* inside,以便它扫描整个字符串:

 (?!.*And).*\.txt$

https://regex101.com/r/1vF50O/1

【讨论】:

  • 我认为您的答案对于我所概述的情况是正确的。那时我似乎偶然发现了一个边缘案例!很高兴知道仅在当前位置匹配的环视。将查找更多有关该作品的信息
  • regex101.com/r/XoyK7T/1 是“仅在当前位置匹配的环视”的另一个示例吗?因为其他明智的环视不包括结果中的条件
  • 是的。第一次尝试前瞻失败(它看到'a'),引擎向右移动一个字符,再次尝试,这次环顾看到'b',然后[a-z]*匹配“bcd”。
【解决方案2】:

您的理解是正确的,问题不在于后视/前瞻。问题在于.* 在这两种情况下都匹配整个字符串。句点. 匹配任何字符,然后在它后面加上*,这使它匹配任何长度的整个字符串。删除它,你的两个正则表达式都可以工作:

(?<!^And)\.txt$

^A(?!\.txt$)

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多