繁体   English   中英

查找正则表达式单词的最后一次出现

[英]Find Last Occurrence of Regex Word

如何找到带有单词边界的单词的最后一次出现? 我为这个词创建了/\btotal\b/的正则表达式。 我将如何使用 search() 来查找此表达式的最后一次出现? 在此先感谢您的帮助!

您可以使用负前瞻来获得最后一场比赛:

/(\btotal\b)(?!.*\b\1\b)/

正则表达式演示 1

正则表达式演示 2

(?!.*\\1)是否定前瞻,以断言捕获的组 #1 即total单词在当前匹配之前不存在。

不使用前瞻但使用相同的正则表达式(已应用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM