有没有JavaScript的String.indexOf()版本允许正则表达式?

2022-08-30 00:26:12

在javascript中,是否存在与String.indexOf()等效的同义词,它采用正则表达式而不是字符串作为第一个参数,同时仍然允许第二个参数?

我需要做类似的事情

str.indexOf(/[abc]/ , i);

str.lastIndexOf(/[abc]/ , i);

虽然 String.search() 将正则表达式作为参数,但它不允许我指定第二个参数!

编辑:
事实证明,这比我原先想象的要难,所以我写了一个小的测试函数来测试所有提供的解决方案......它假定正则表达式IndexOf 和正则表达式LastIndexOf 已添加到 String 对象中。

function test (str) {
    var i = str.length +2;
    while (i--) {
        if (str.indexOf('a',i) != str.regexIndexOf(/a/,i)) 
            alert (['failed regexIndexOf ' , str,i , str.indexOf('a',i) , str.regexIndexOf(/a/,i)]) ;
        if (str.lastIndexOf('a',i) != str.regexLastIndexOf(/a/,i) ) 
            alert (['failed regexLastIndexOf ' , str,i,str.lastIndexOf('a',i) , str.regexLastIndexOf(/a/,i)]) ;
    }
}

我正在测试如下,以确保至少对于一个字符正则表达式,结果与我们使用 indexOf 相同

在 xes
测试('xxx') 中查找 a;
test('axx');
test('xax');
test('xxa');
test('axa');
test('xaa');
test('aax');
test('aaa');


答案 1

构造函数的实例具有 .search() 方法,该方法接受 RegExp 并返回第一个匹配项的索引。String

要从特定位置开始搜索(伪造 的第二个参数 ),您可以关闭第一个字符:.indexOf()slicei

str.slice(i).search(/re/)

但是这将在较短的字符串中获取索引(在第一部分被切除之后),因此您需要将切除部分()的长度添加到返回的索引中,如果不是。这将为您提供原始字符串中的索引:i-1

function regexIndexOf(text, re, i) {
    var indexInSuffix = text.slice(i).search(re);
    return indexInSuffix < 0 ? indexInSuffix : indexInSuffix + i;
}

答案 2

结合已经提到的一些方法(indexOf显然相当简单),我认为这些是可以解决问题的函数:

function regexIndexOf(string, regex, startpos) {
    var indexOf = string.substring(startpos || 0).search(regex);
    return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
}

function regexLastIndexOf(string, regex, startpos) {
    regex = (regex.global) ? regex : new RegExp(regex.source, "g" + (regex.ignoreCase ? "i" : "") + (regex.multiLine ? "m" : ""));
    if(typeof (startpos) == "undefined") {
        startpos = string.length;
    } else if(startpos < 0) {
        startpos = 0;
    }
    var stringToWorkWith = string.substring(0, startpos + 1);
    var lastIndexOf = -1;
    var nextStop = 0;
    while((result = regex.exec(stringToWorkWith)) != null) {
        lastIndexOf = result.index;
        regex.lastIndex = ++nextStop;
    }
    return lastIndexOf;
}

更新:经过编辑,现在似乎模仿了。如果它仍然失败以及在什么情况下,请让我知道。regexLastIndexOf()lastIndexOf()


更新:通过此页面上评论中找到的所有测试,以及我自己的测试。当然,这并不意味着它是防弹的。任何反馈赞赏。