【发布时间】:2019-07-25 16:33:29
【问题描述】:
我有一个字符串,我想获得一个数组,其中包含该字符串中与某个正则表达式条件不匹配的字符的索引(位置)。
这里的问题是,如果我这样写:
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 -
不能'您只需更改正则表达式以便搜索非字母数字字符:
/[^A-Za-z0-9]/ -
@WiktorStribiżew 感谢您的解释,因为这是我提出问题的原因,因为我不明白为什么会这样。
-
@RobinZigmond 谢谢你,因为这正是我想要达到的目标!
-
抱歉@WiktorStribiżew,您可以发表您的评论作为答案,以便我接受吗?它解释了为什么
exec以无限循环结束,并为我的案例带来了一个可行的答案,从而解决了这个问题。谢谢!
标签: javascript regex regex-negation string-operations