【问题标题】:Negative Lookbehind expression for not ending with exp : '\w+(?<!exp)\b' or '\w+\b(?<!exp)' [duplicate]不以 exp 结尾的否定 Lookbehind 表达式:'\w+(?<!exp)\b' 或 '\w+\b(?<!exp)' [重复]
【发布时间】:2017-08-12 05:17:19
【问题描述】:

对于表达式 (?&lt;!foo),Negative Lookbehind ,断言紧接在字符串中当前位置之前的不是 foo。
现在匹配不以字符abc结尾的字符串。
正式表达式为\w+(?&lt;!abc)\b\b\w+(?&lt;!abc)\b

echo "xxabc jkl" | grep -oP  '\w+(?<!abc)\b'
jkl

让我们尝试另一种形式:\w+\b(?&lt;!abc)

echo "xxabc jkl" | grep -oP  '\w+\b(?<!abc)'
jkl

它也得到正确答案。
在我看来,\w+\b(?&lt;!abc) 不是 Negative Lookbehind,(?&lt;!abc) 后面没有任何东西,它不能称为 Negative Lookbehind。
1. 表达式\w+\b(?&lt;!abc) 是否定的Lookbehind 吗?
2.为什么\w+\b(?&lt;!abc)\w+(?&lt;!abc)\b效果一样?

【问题讨论】:

  • 请记住,\b 是一个零宽度匹配 - 无论它出现在之前还是之后,都将在字符串中的完全相同的点检查后向匹配.

标签: regex negative-lookbehind


【解决方案1】:

1)这是一个负回溯期。如果您想匹配未由其他内容处理的内容,则使用负回溯。 ?&lt;!abc 是一个否定回顾窗口。因此,只有在进行中的标记为 not "abc" 时才为真,而提供的字符串为真:"xxabc jkl" 从技术上讲,空格在进行中"jkl" 因此匹配。

2) \b 查找单词边界。单词边界适用于两个正则表达式中都存在的空格和字符串结尾。如果您真的想看到不同之处,请尝试从输入中取出空间。所以 使用"xxabcjkl"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多