查找Regex Word的最后一次出现

Find Last Occurrence of Regex Word

本文关键字:最后一次 Regex Word 查找      更新时间:2023-09-26

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

您可以使用负前瞻来获得最后一个匹配:

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

RegEx Demo 1

RegEx Demo 2

CCD_ 2是否定前瞻以断言捕获的组#1,即total字不存在于当前匹配之前。

如果不使用lookahead,但使用相同的regex(已应用g,即全局标志),则可以选择将字符串与regex匹配并获得最后一个匹配项。

var matches = yourString.match(/'btotal'b/g);
var lastMatch = matches[matches.length-1];

我喜欢@anubhava的回答。如果您的字符串可能包含换行符,您可以尝试以下负向前看:

('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]*将有效地匹配任何字符,包括新行。此外,在捕获组中并不真正需要字边界CCD_ 8。

在@anubhava链接的第二个例子中,它只匹配找到的第一个total单词,因为模式(?!.*'b'1'b)不会考虑换行符。您可以通过在示例邮件文本的开头添加单词total进行验证。

演示链接:https://regex101.com/r/VlhRWM/3

我只是有点担心['S's]*模式的性能。

此外,我认为注释中报告的错误,对于未找到匹配的组,与链接演示中选择的regex ECMAScript风格有关,使用PCRE可以正确报告匹配。


注意
此模式将考虑所提供的ENTIRE输入中的有效匹配。如果每行需要匹配,则需要启用/g全局标志并使用@anubhava answer!