javascript - 如何使用 JS 正则表达式查找所有不匹配字符的索引?
问题描述
我有一个字符串,我想获得一个数组,其中包含该字符串中与某个正则表达式条件不匹配的字符的索引(位置)。
这里的问题是,如果我这样写:
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
可能不是实现我正在寻找的最佳方式为了。
解决方案
这种方法用星号替换所有匹配的字符*
。然后,我们迭代替换的字符串并检索与正则表达式字符类不匹配的所有索引。
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 的字符不匹配,因为它们是下划线。
推荐阅读
- blazor - Blazor 服务器应用 $(document).ready() 等效项
- python - 使用 for 循环和 group by 计算百分比
- flutter - 自定义钩子中是否需要上下文?
- python - 最大化给定容量的价值
- node.js - 如何将缩小的第三方库加载或添加到 webpack 应用程序中?
- java - Thymeleaf Checkbox Binding - 发送布尔值而不是值
- laravel - Laravel:保存/附加/同步自定义枢轴模型(belongsToMany)
- javascript - 如何计算时间表的两次之间的时隙
- java - 为什么我在流中执行价格映射后无法访问 itemName?
- javascript - 如何从 Cloud Firestore 中删除集合及其所有子集合和文档