![](/img/trans.png)
[英]Javascript Search for String Starting at End & Stopping at Another String
[英]Javascript: String search for regex, starting at the end of the string
也许这可能是有用和容易的:
str.lastIndexOf(str.match(<your_regex_here>).pop());
您可以创建一个反向函数,例如:
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从评论中给出了这一点:
https://stackoverflow.com/a/274094/402037
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;
}
这提供了我需要的功能,我测试了我的正则表达式,并且成功了。 所以我会用这个
也许这样的东西适合您?
使用Javascript
function 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
这要求您正确设置正则表达式的格式,以使其与所需的模式和全局模式完全匹配(如您的问题中给出的),例如/.*(<\\/?([az][a-z0-9]*)\\b[^>]*>?)/i
不适用于此功能。 但是您得到的是一个干净快速的函数。
这取决于您确切要搜索的内容。 您可以使用string.lastIndexOf
或在regexp内使用$
(字符串的结尾)。
更新:尝试regexp
/<\/?([a-z][a-z0-9]*)\b[^>]*>?[\w\W]*$/gi
假设您要查找字符串“ token”,那么您需要的“ token”位置在字符串的末尾没有其他“ token”。
因此,您应该像这样编写正则表达式:
$token = 'token';
$re = "/(?:$token)[^(?:$token)]*$/";
这将找到您的“令牌”,直到字符串结尾再找不到其他“令牌”。 “(?:”分组只是使该组不存储,从而略微提高了性能并节省了内存。
var m = text.match(/.*(<\/?([a-z][a-z0-9]*)\b[^>]*>?)/i);
if (m) {
textFound = m[1];
position = text.lastIndexOf(textFound);
}
使用。*跳过尽可能多的文本,捕获找到的文本并使用lastIndexOf搜索
编辑:
好吧,如果找到了文本,则无需使用lastIndexOf进行搜索。 m [0]包含完全符合(包括所有初始填充),而m [1]包含搜索到的文本。 因此,找到的文本的位置是m [0] .length-m [1] .length
var m = text.match(/.*(<\/?([a-z][a-z0-9]*)\b[^>]*>?)/i);
if (m) {
textFound = m[1];
position = m[0].length - m[1].length;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.