在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)]) ; } }
我正在测试以确保至少对于一个字符正则表达式,其结果与我们使用indexOf相同
//在xes test(’xxx’)中寻找a ; 测试(’axx’); 测试(’xax’); 测试(’xxa’); 测试(’axa’); 测试(’xaa’); 测试(’aax’); 测试(’aaa’);
结合已经提到的一些方法(indexOf显然相当简单),我认为这些功能可以解决问题:
String.prototype.regexIndexOf = function(regex, startpos) { var indexOf = this.substring(startpos || 0).search(regex); return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf; } String.prototype.regexLastIndexOf = function(regex, startpos) { regex = (regex.global) ? regex : new RegExp(regex.source, "g" + (regex.ignoreCase ? "i" : "") + (regex.multiLine ? "m" : "")); if(typeof (startpos) == "undefined") { startpos = this.length; } else if(startpos < 0) { startpos = 0; } var stringToWorkWith = this.substring(0, startpos + 1); var lastIndexOf = -1; var nextStop = 0; while((result = regex.exec(stringToWorkWith)) != null) { lastIndexOf = result.index; regex.lastIndex = ++nextStop; } return lastIndexOf; }
显然,修改内置的String对象将对大多数人发出危险信号,但这可能不是什么大问题了。只需意识到这一点。
更新:编辑,regexLastIndexOf()以便lastIndexOf()现在看起来像。请让我知道它是否仍然失败以及在什么情况下。
regexLastIndexOf()
lastIndexOf()
更新:通过此页面上的评论以及我自己的所有测试。当然,这并不意味着它是防弹的。任何反馈表示赞赏。