如果后面跟着它的组中的内容,为什么否定前瞻不会阻止匹配?

Why doesn't negative lookahead prevent matching if followed by what's in its group?

我有以下 RegExp: (?<= )L.*(?!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)

RegEx Demo

正则表达式详细信息:

  • (?<= {4}): 当当前位置前有 4 个空格时允许匹配
  • L.*$:匹配以L开始到结束
  • 的字符串
  • (?<!MH):当我们在当前位置(结束)之前有 MH 时匹配失败

您的模式的最后一个条件被忽略,因为该模式首先断言左侧有 4 个空格,然后匹配 L,然后匹配除换行符之外的任何字符,直到字符串末尾。

然后,在字符串的末尾,模式断言直接在右边的不是 MH。该断言是正确的,因为它在字符串的末尾,所以 MH 不能在右边。

您可以更新您的模式以匹配 L 并在它之后直接使用量词 .* 断言字符串末尾没有 MH。

(?<= {4})L(?!.*MH$).*

Regex demo