[英]Find Last Occurrence of Regex Word
如何找到带有单词边界的单词的最后一次出现? 我为这个词创建了/\btotal\b/
的正则表达式。 我将如何使用 search() 来查找此表达式的最后一次出现? 在此先感谢您的帮助!
不使用前瞻但使用相同的正则表达式(已应用g
,即全局标志),选项是将字符串与正则表达式匹配并获得最后一个匹配项。
var matches = yourString.match(/\btotal\b/g);
var lastMatch = matches[matches.length-1];
我喜欢@anubhava 的回答。 如果您的字符串可能包含换行符,您可以尝试以下 Negative Lookahead:
(\btotal\b)(?!.*[\r\n]*.*\1)
见一个例子在regex101。 另见下文,我们用<TOTAL>
替换最后一次出现的total
var str = `
something total abc
total
foo total anything here
total
Anything total done!
`;
var finalStr = str.replace(/(\btotal\b)(?!.*[\r\n]*.*\1)/, "<TOTAL>");
console.log(finalStr)
你会得到:
something total abc
total
foo total anything here
total
Anything <TOTAL> done!
@anubhava 答案对于单行输入是正确的,但这个想法是正确的,谢谢分享!
我认为他的回答可以改进(但如果我错了,请纠正我)以下版本:
/\b(total)\b(?![\s\S]*\b\1\b)/
这里的区别在于[\\s\\S]*
将有效匹配任何字符,包括新行。 在捕获组中也不需要单词边界\\b
。
在@anubhava 链接的第二个示例中,它仅匹配找到的第一个total
单词,因为模式(?!.*\\b\\1\\b)
不会考虑换行符。 您可以通过在示例邮件文本开头的某处添加单词total
进行验证。
演示链接: https : //regex101.com/r/VlhRWM/3
我只是有点担心[\\S\\s]*
模式的性能。
此外,我认为评论中报告的错误,对于未找到匹配组,与链接演示中选择的正则表达式 ECMAScript 风格有关,使用 PCRE 正确报告匹配。
注意。
此模式将考虑提供的 ENTIRE 输入中的有效匹配。 如果您需要每行匹配,则需要启用/g
全局标志并使用 @anubhava 答案!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.