繁体   English   中英

如何使用JS正则表达式查找所有不匹配字符的索引?

[英]How to find indexes of all non-matching characters with a JS regex?

我有一个字符串,我想得到一个数组,其中该字符串中的字符的索引(位置)与某个正则表达式条件不匹配。

这里的问题是,如果我这样写:

let match;
let reg = /[A-Za-z]|[0-9]/g;
let str = "1111-253-asdasdas";
let indexes = [];

do {
    match = reg.exec(str);
    if (match) indexes.push(match.index);
} while (match);

有用。 它返回所有数字或字母字符的索引。 但问题是,如果我试图反过来,在Regex中使用负面预测,就像这样:

let match;
let reg = /(?!([A-Za-z]|[0-9]))/g;
let str = "1111-253-asdasdas";
let indexes = [];

do {
    match = reg.exec(str);
    if (match) indexes.push(match.index);
} while (match);

它以无限循环结束。

我想要实现的结果与第一种情况相同,但是使用负正则表达式,所以在这种情况下结果将是:

indexes = [4, 8]; // which are the indexes in which a non-alphanumerical character appears

这个循环是错误的,还是正则表达式是搞乱的人? 也许exec没有使用负面前瞻Regex表达式?

我会理解正则表达式不能正常工作(因为它可能被错误地格式化),但我不理解无限循环,这让我觉得exec可能不是实现我的最佳方式寻找。

此方法用星号*替换所有匹配的字符。 然后,我们迭代替换的字符串并检索与正则表达式字符类匹配的所有索引。

 var str = "1111-253-asdasdas"; var pattern = /[^A-Za-z0-9]/g; str = str.replace(pattern, "*"); var indices = []; for(var i=0; i < str.length;i++) { if (str[i] === "*") indices.push(i); } console.log(indices.toString()); 

在这种情况下,只有位置4和8的字符不匹配,因为它们是下划线。

原因

无限循环很容易解释:正则表达式有一个g修饰符,因此在上一次成功匹配结束后,即在lastIndex值之后,尝试匹配模式的多次出现,从而开始每次匹配尝试:

请参阅exec文档

如果正则表达式使用“ g ”标志,则可以多次使用exec()方法在同一字符串中查找连续匹配。 执行此操作时,搜索从正则表达式的lastIndex属性指定的str的子字符串开始

但是,由于您的模式匹配空字符串,并且如果索引等于lastIndex ,则不检查条件,正则表达式无法在字符串中前进。

使用正则表达式匹配任何非字母数字字符, /[\\W_]/g 由于它与空字符串不匹配,因此RegExp对象的lastIndex属性将随每次匹配而更改,并且不会发生无限循环。

JS演示:

 let match, indexes = []; let reg = /[\\W_]/g; let str = "1111-253-asdasdas"; while (match = reg.exec(str)) { indexes.push(match.index); } console.log(indexes); 

另外,请参阅如何手动移动lastIndex属性值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM