是否有允许正则表达式的JavaScript的String.indexOf()版本?
在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,i,str.lastIndexOf('a',i) , str.regexLastIndexOf(/a/,i)]) ;
}
}
我正在测试如下,以确保至少对于一个字符的正则表达式,结果与我们使用indexOf
//在xes中寻找一个
试验( 'XXX');
试验( '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()
。 请让我知道它是否仍然失败,并在什么情况下。
更新:通过在此页面上的评论中找到的所有测试,以及我自己的。 当然,这并不意味着它是防弹的。 任何反馈赞赏。
String
构造函数的实例有一个.search()
方法,它接受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;
}
我有一个短版本给你。 这对我来说很有效!
var match = str.match(/[abc]/gi);
var firstIndex = str.indexOf(match[0]);
var lastIndex = str.lastIndexOf(match[match.length-1]);
如果你想要一个原型版本:
String.prototype.indexOfRegex = function(regex){
var match = this.match(regex);
return match ? this.indexOf(match[0]) : -1;
}
String.prototype.lastIndexOfRegex = function(regex){
var match = this.match(regex);
return match ? this.lastIndexOf(match[match.length-1]) : -1;
}
编辑 :如果你想添加fromIndex的支持
String.prototype.indexOfRegex = function(regex, fromIndex){
var str = fromIndex ? this.substring(fromIndex) : this;
var match = str.match(regex);
return match ? str.indexOf(match[0]) + fromIndex : -1;
}
String.prototype.lastIndexOfRegex = function(regex, fromIndex){
var str = fromIndex ? this.substring(0, fromIndex) : this;
var match = str.match(regex);
return match ? str.lastIndexOf(match[match.length-1]) : -1;
}
要使用它,就像这样简单:
var firstIndex = str.indexOfRegex(/[abc]/gi);
var lastIndex = str.lastIndexOfRegex(/[abc]/gi);
链接地址: http://www.djcxy.com/p/87001.html
上一篇: Is there a version of JavaScript's String.indexOf() that allows for regular expressions?