在 JavaScript 中,负外观等同于

2022-08-30 02:13:13

有没有办法在JavaScript正则表达式中实现等效的负观景?我需要匹配一个不以一组特定字符开头的字符串。

似乎我无法找到一个正则表达式,如果匹配的部分在字符串的开头找到,则无法失败。负面的观察似乎是唯一的答案,但JavaScript没有答案。

这是我想工作的正则表达式,但它没有:

(?<!([abcdefg]))m

因此,它将与“jim”或“m”中的“m”匹配,但与“jam”不匹配


答案 1

自 2018 年以来,Lookbehind AssertionsECMAScript 语言规范的一部分。

// positive lookbehind
(?<=...)
// negative lookbehind
(?<!...)

2018年之前的答案

由于Javascript支持负面的展望,因此一种方法是:

  1. 反转输入字符串

  2. 与反向正则表达式匹配

  3. 反转和重新格式化匹配项


const reverse = s => s.split('').reverse().join('');

const test = (stringToTests, reversedRegexp) => stringToTests
  .map(reverse)
  .forEach((s,i) => {
    const match = reversedRegexp.test(s);
    console.log(stringToTests[i], match, 'token:', match ? reverse(reversedRegexp.exec(s)[0]) : 'Ø');
  });

示例 1:

以下是@andrew-ensley的问题:

test(['jim', 'm', 'jam'], /m(?!([abcdefg]))/)

输出:

jim true token: m
m true token: m
jam false token: Ø

示例 2:

下面@neaumusic注释(匹配但不匹配,令牌为):max-heightline-heightheight

test(['max-height', 'line-height'], /thgieh(?!(-enil))/)

输出:

max-height true token: height
line-height false token: Ø

答案 2

Lookbehind Assertions 在 2018 年被 ECMAScript 规范接受

正面外观使用:

console.log(
  "$9.99  €8.47".match(/(?<=\$)\d+\.\d*/) // Matches "9.99"
);

负面外观使用:

console.log(
  "$9.99  €8.47".match(/(?<!\$)\d+\.\d*/) // Matches "8.47"
);

平台支持: