str.lastIndexOf(str.match(<your_regex_here>).pop());
match()
返回 null,这将抛出一个错误。添加条件语句或使用可选链运算符,例如:str.lastIndexOf(str.match(<your_regex_here>)?.pop());
- thdoanfunction lastIndexOfRx(string, regex) {
var match = string.match(regex);
return match ? string.lastIndexOf(match.slice(-1)) : -1;
}
var rx = /<\/?([a-z][a-z0-9]*)\b[^>]*>?/gi;
console.log(lastIndexOfRx("", rx));
console.log(lastIndexOfRx("<i>it</i><b>bo</b>", rx));
仅供参考,这个函数与您选择的函数相比。 jsperf
这需要您正确地格式化正则表达式以精确匹配所需模式并进行全局匹配(如您的问题中所述)。例如,/.*(<\/?([a-z][a-z0-9]*)\b[^>]*>?)/i
不适用于此函数。但您所得到的是一个干净且快速的函数。
function reverse (s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
var yourString = reverse("Your string goes here");
var regex = new Regex(your_expression);
var result = yourString.match(regex);
function reverseWord(s) {
var o = '';
var split = s.split(' ');
for (var i = split.length - 1; i >= 0; i--)
o += split[i] + ' ';
return o;
}
var yourString = reverseWord("Your string goes here");
var regex = new Regex(your_expression);
var result = yourString.match(regex);
Andreas gave this from the comment:
https://dev59.com/w3VC5IYBdhLWcg3wfxQ8#274094
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;
}
这提供了我所需的功能,我测试了我的正则表达式,并且成功了。因此我将使用它。
var m = text.match(/.*(<\/?([a-z][a-z0-9]*)\b[^>]*>?)/i);
if (m) {
textFound = m[1];
position = text.lastIndexOf(textFound);
}
var m = text.match(/.*(<\/?([a-z][a-z0-9]*)\b[^>]*>?)/i);
if (m) {
textFound = m[1];
position = m[0].length - m[1].length;
}
这取决于您要搜索什么。您可以使用 string.lastIndexOf
或在正则表达式中使用 $
(字符串的结尾)。
更新:尝试使用正则表达式。
/<\/?([a-z][a-z0-9]*)\b[^>]*>?[\w\W]*$/gi
假设您正在寻找一个字符串“token”,那么您需要找到没有其他“token”跟随直到字符串末尾的“token”的位置。
因此,您应该像这样组成您的正则表达式:
$token = 'token';
$re = "/(?:$token)[^(?:$token)]*$/";
这将在字符串结束之前找到您的“token”,在那里找不到更多的“token”。“(?:”分组只是使该组不存储,稍微提高性能并节省内存。