断言问题,特别是否定前瞻断言“x(?!y)”

问题描述 投票:0回答:1

所以我一直在练习和阅读有关断言的内容,并遇到了这个问题:

const text14 = "123 456 7890";
const pattern12 = /\d+(?!0)/g;

let matches12 = text14.match(pattern12);
console.log(matches12);

输出应该是 ['123', '456'] 但事实并非如此。 它的['123','456','7890']

稍微修改了一下之后,我意识到当我在断言以及字符串本身上放置一个空格时,它被删除了,但只有 9。

const text14 = "123 456 789 0";
const pattern12 = /\d+(?! 0)/g;

let matches12 = text14.match(pattern12);
console.log(matches12);

输出:

['123', '456', '78', '0']

这让我相信断言对数字有不同的作用。 我一直试图获得的期望结果是使用否定前瞻断言“x(?!y)”将原始的“123 456 7890”转换为 ['123', '456']。

javascript regex string regex-lookarounds assertion
1个回答
0
投票

正则表达式

/\d+(?!0)/g
将匹配所有子字符串:

  • 以一系列数字开头(尽可能多,至少一个)
  • 后面没有 0

问题在于 0 本身就是一个数字。正则表达式不断接受包括零的数字,直到遇到非数字的字符,然后才检查其后的字符是否不是零。所以消极的前瞻永远不会发挥作用。

您可能会想简单地使用负向回顾,如下所示:

"123 456 7890".match(/\d+(?<!0)/g); // ["123", "456", "789"]

但在这种情况下,正则表达式只会在零之前停止,而不是按照您的意愿丢弃整个序列。相反,您应该首先匹配以非零数字结尾的数字序列,然后确保其后没有其他数字。

"123 456 7890".match(/\d*[1-9](?!\d)/g); // ["123", "456"]
© www.soinside.com 2019 - 2024. All rights reserved.