首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有一个版本的JavaScript的String.indexOf()允许正则表达式?

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

Stack Overflow用户
提问于 2008-11-07 22:03:34
回答 14查看 194.5K关注 0票数 250

在javascript中,有没有String.indexOf()的等价物,它接受正则表达式而不是字符串作为第一个参数,同时仍然允许第二个参数?

我需要做一些事情,比如

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

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

虽然String.search()接受regexp作为参数,但它不允许我指定第二个参数!

编辑:

事实证明这比我最初想象的要难,所以我写了一个小测试函数来测试所有提供的解决方案……它假设已经将regexIndexOf和regexLastIndexOf添加到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)]) ;
    }
}

我进行了如下测试,以确保至少对于一个字符regexp,结果与使用indexOf时相同

//在xes中查找a

test('xxx');

test('axx');

test('xax');

test('xxa');

test('axa');

test('xaa');

test('aax');

test('aaa');

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2008-11-08 00:33:08

结合前面提到的几种方法( 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()。请让我知道它是否仍然失败,在什么情况下。

更新:通过本页面和我自己的评论中找到的所有测试。当然,这并不意味着它是防弹的。任何反馈都很感谢。

票数 150
EN

Stack Overflow用户

发布于 2008-11-07 22:11:49

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

要从特定位置开始搜索(伪造.indexOf()的第二个参数),您可以slice掉前几个i字符:

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

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

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

Stack Overflow用户

发布于 2015-07-13 06:05:07

使用:

str.search(regex)

请参阅文档here.

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/273789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档