我有一个字符串,我想获得一个数组,其中包含该字符串中不符合特定正则表达式条件的字符的索引(位置)。
问题在于,如果我像这样写:
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);
它有效。它返回所有数字或字母字符的索引。但问题是,如果我尝试使用正则表达式中的负向前瞻来实现相反的效果,像这样:
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
在处理负向前瞻的正则表达式时存在问题?我能理解正则表达式不按我预期的方式工作(因为它可能格式不正确),但我不理解无限循环,这让我认为exec
可能不是实现我想要的功能的最佳方法。
g
修饰符,因此尝试匹配模式的多个出现次数,但由于您的模式匹配空字符串,并且您没有检查index
是否等于lastIndex
的条件,所以正则表达式无法在字符串中前进。使用正则表达式匹配任何非字母数字字符,/[\W_]/g
。 - Wiktor Stribiżew/[^A-Za-z0-9]/
? - Robin Zigmond