所以我一直在练习和阅读有关断言的内容,并遇到了这个问题:
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']。
正则表达式
/\d+(?!0)/g
将匹配所有子字符串:
问题在于 0 本身就是一个数字。正则表达式不断接受包括零的数字,直到遇到非数字的字符,然后才检查其后的字符是否不是零。所以消极的前瞻永远不会发挥作用。
您可能会想简单地使用负向回顾,如下所示:
"123 456 7890".match(/\d+(?<!0)/g); // ["123", "456", "789"]
但在这种情况下,正则表达式只会在零之前停止,而不是按照您的意愿丢弃整个序列。相反,您应该首先匹配以非零数字结尾的数字序列,然后确保其后没有其他数字。
"123 456 7890".match(/\d*[1-9](?!\d)/g); // ["123", "456"]