我有一个Javascript迭代/正则表达式,这让我疯狂,并希望有人可以提供一些见解,因为我遇到的挑战似乎是JS特有的东西。正如您所看到的,我检查了正则表达式,以查看字母在字符串中是否出现2次或更多次,如果它没有,则返回指定索引处的字母。但是,对于诸如"测试"之类的字符串它将返回" t"尽管" t"在字符串中存在两次。然而,其他字符串,例如" aaaaac"它会正确地返回" c"。我已经在Rubular中对它进行了测试,并且Regex表达式运行正常,因此我无法确定它为什么在这种情况下无法工作。
function found (str) {
for (const number in str) {
let regex = new RegExp( str[number] + "{2,}");
if (!str.match(regex)) {
return str[number]
}
}
}
我非常感谢能够提供的任何见解!
答案 0 :(得分:1)
x{n,m}
正则表达式模式匹配x的序列。在单词" testing"中,t是独立的,并且模式不匹配。
使用全局g
标记搜索数组中字母的所有外观,然后将找到的匹配数与阈值(2)进行比较:
function found (str) {
for (const number in str) {
const regex = new RegExp(str[number], 'g');
const match = str.match(regex);
if (!str.match(regex) || match.length < 2) {
return str[number];
}
}
}
console.log(found('testing'));
&#13;
答案 1 :(得分:1)
错误在你的正则表达式中,它只匹配连续的字符,而“aaaac”是一个特定的测试。所以要做好工作,只需改变它。
function found (str) {
for (const number in str) {
let regex = new RegExp( str[number] + ".*" + str[number]);
if (!str.match(regex)) {
return str[number]
}
}
}
答案 2 :(得分:1)
t{2,}
测试t
的两个或更多紧邻的实例。它与attack
和attttack
匹配,但与testing
不匹配,tt
从不包含双字符序列t.*t
。
相反,您需要t
形式的某些内容,它会测试t
,后跟零个或多个字符,然后在某个时刻再测试另一个new RegExp(str[number] + ".*" + str[number]);
。请尝试改为:
for
但请注意,您的代码有几个与此问题无关的属性:
使用in
- String.prototype
循环包括所有可枚举属性,其中可能包含多个字符串中字符的索引。如果库使用可枚举属性扩展0
,它将包含在您的循环中,这可能会导致意外结果。选择从str.length-1
到.
的数字循环。
动态创建的正则表达式不会清理输入,如果测试正则表达式特殊字符(如*
,?
或<tr class="row" *ngFor="let pipline of piplines | datafilter:
{Status:searchText}">
,则会导致问题。请参阅Is there a RegExp.escape function in Javascript?