如何解决是否有允许正则表达式的 JavaScript 的 String.indexOf() 版本?
结合已经提到的一些方法( 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()
。请让我知道它是否仍然失败以及在什么情况下。
更新:通过本页评论中的所有测试,以及我自己的测试。当然,这并不意味着它是防弹的。任何反馈表示赞赏。
解决方法
在 javascript 中,是否存在等效于 String.indexOf() 的方法,它采用正则表达式而不是第一个参数的字符串,同时仍然允许第二个参数?
我需要做类似的事情
str.indexOf(/[abc]/,i);
和
str.lastIndexOf(/[abc]/,i);
虽然 String.search() 将正则表达式作为参数,但它不允许我指定第二个参数!
编辑:
事实证明这比我最初想象的要难,所以我编写了一个小测试函数来测试所有提供的解决方案......它假设 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.lastIndexOf('a',str.regexLastIndexOf(/a/,i)]) ;
}
}
我正在测试如下,以确保至少对于一个字符正则表达式,结果与我们使用 indexOf 相同
//在xes中寻找a
test(‘xxx’);
test(‘axx’);
test(‘xax’);
test(‘xxa’);
test(‘axa’);
test(‘xaa’);
test(‘aax’);
test(‘aaa’);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。