在 JavaScript 中,负外观等同于
2022-08-30 02:13:13
有没有办法在JavaScript正则表达式中实现等效的负观景?我需要匹配一个不以一组特定字符开头的字符串。
似乎我无法找到一个正则表达式,如果匹配的部分在字符串的开头找到,则无法失败。负面的观察似乎是唯一的答案,但JavaScript没有答案。
这是我想工作的正则表达式,但它没有:
(?<!([abcdefg]))m
因此,它将与“jim”或“m”中的“m”匹配,但与“jam”不匹配
有没有办法在JavaScript正则表达式中实现等效的负观景?我需要匹配一个不以一组特定字符开头的字符串。
似乎我无法找到一个正则表达式,如果匹配的部分在字符串的开头找到,则无法失败。负面的观察似乎是唯一的答案,但JavaScript没有答案。
这是我想工作的正则表达式,但它没有:
(?<!([abcdefg]))m
因此,它将与“jim”或“m”中的“m”匹配,但与“jam”不匹配
自 2018 年以来,Lookbehind Assertions 是 ECMAScript 语言规范的一部分。
// positive lookbehind
(?<=...)
// negative lookbehind
(?<!...)
2018年之前的答案
由于Javascript支持负面的展望,因此一种方法是:
反转输入字符串
与反向正则表达式匹配
反转和重新格式化匹配项
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-height
line-height
height
test(['max-height', 'line-height'], /thgieh(?!(-enil))/)
输出:
max-height true token: height
line-height false token: Ø
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"
);
平台支持: