如果后面跟着它的组中的内容,为什么否定前瞻不会阻止匹配?
Why doesn't negative lookahead prevent matching if followed by what's in its group?
我有以下 RegExp
: (?<= )L.*(?!MH$)
.
想法是:
(?<= )
匹配前必须有 4 个空格,但不包含在匹配中。
L.*
匹配必须以 L
开头并包括字符串的其余部分 ...
(?!MH$)
UNLESS MH
在字符串的末尾。
忽略最后一个条件。以 MH
结尾的字符串仍然匹配。为什么?
const regExpStr = String.raw`(?<= )L.*(?!MH$)`;
const regExp = new RegExp(regExpStr);
const str = '2. L2 B4 RHODA 1 ADDN,SOMECITY,OK,74999 - 81 HILLCREST MH';
const match = str.match(regExp)?.[0];
console.log(match);
您可以使用此正则表达式,最后进行额外的负面回溯:
(?<= {4})L.*$(?<!MH)
正则表达式详细信息:
(?<= {4})
: 当当前位置前有 4 个空格时允许匹配
L.*$
:匹配以L
开始到结束 的字符串
(?<!MH)
:当我们在当前位置(结束)之前有 MH
时匹配失败
您的模式的最后一个条件被忽略,因为该模式首先断言左侧有 4 个空格,然后匹配 L
,然后匹配除换行符之外的任何字符,直到字符串末尾。
然后,在字符串的末尾,模式断言直接在右边的不是 MH。该断言是正确的,因为它在字符串的末尾,所以 MH 不能在右边。
您可以更新您的模式以匹配 L
并在它之后直接使用量词 .*
断言字符串末尾没有 MH。
(?<= {4})L(?!.*MH$).*
我有以下 RegExp
: (?<= )L.*(?!MH$)
.
想法是:
(?<= )
匹配前必须有 4 个空格,但不包含在匹配中。L.*
匹配必须以L
开头并包括字符串的其余部分 ...(?!MH$)
UNLESSMH
在字符串的末尾。
忽略最后一个条件。以 MH
结尾的字符串仍然匹配。为什么?
const regExpStr = String.raw`(?<= )L.*(?!MH$)`;
const regExp = new RegExp(regExpStr);
const str = '2. L2 B4 RHODA 1 ADDN,SOMECITY,OK,74999 - 81 HILLCREST MH';
const match = str.match(regExp)?.[0];
console.log(match);
您可以使用此正则表达式,最后进行额外的负面回溯:
(?<= {4})L.*$(?<!MH)
正则表达式详细信息:
(?<= {4})
: 当当前位置前有 4 个空格时允许匹配L.*$
:匹配以L
开始到结束 的字符串
(?<!MH)
:当我们在当前位置(结束)之前有MH
时匹配失败
您的模式的最后一个条件被忽略,因为该模式首先断言左侧有 4 个空格,然后匹配 L
,然后匹配除换行符之外的任何字符,直到字符串末尾。
然后,在字符串的末尾,模式断言直接在右边的不是 MH。该断言是正确的,因为它在字符串的末尾,所以 MH 不能在右边。
您可以更新您的模式以匹配 L
并在它之后直接使用量词 .*
断言字符串末尾没有 MH。
(?<= {4})L(?!.*MH$).*