如何找到带有字边界的单词的最后一次出现?我为这个单词创建了一个/\btotal\b/
的正则表达式。我如何使用search()查找此表达式的最后一次出现?在此先感谢您的帮助!
答案 0 :(得分:12)
您可以使用否定前瞻来获得最后一场比赛:
/(\btotal\b)(?!.*\b\1\b)/
(?!.*\1)
是负面预测,断言在当前比赛之前,已捕获的组#1即total
字段不存在。
答案 1 :(得分:6)
不使用前瞻但使用相同的正则表达式(已应用g
,即全局,标志),选项是将字符串与正则表达式匹配并获得最后一个匹配。
var matches = yourString.match(/\btotal\b/g);
var lastMatch = matches[matches.length-1];
答案 2 :(得分:0)
我喜欢@anubhava的回答。并且如果您的字符串可能包含换行符,则可以尝试以下负向查找:
(\btotal\b)(?!.*[\r\n]*.*\1)
请参见regex101上的an example。另请参见下文,我们将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!
您将获得:
def Function():
global exp, level
exp += 1
if exp > 100:
exp=0
level+=1
label.config(text=exp)
答案 3 :(得分:0)
@anubhava答案对于单行输入是正确的,但是这个想法是正确的,谢谢您的分享!
我认为他的回答可以通过以下版本得到改善(但如果我错了,请纠正我):
/\b(total)\b(?![\s\S]*\b\1\b)/
此处的区别在于[\s\S]*
将有效地match any character,包括新行。此外,在捕获组中并不需要单词边界\b
。
在@anubhava链接的第二个示例中,它仅与找到的第一个total
单词匹配,因为模式(?!.*\b\1\b)
将不考虑换行符。您可以通过在示例邮件文本开头的某处添加total
一词来进行验证。
演示链接: https://regex101.com/r/VlhRWM/3
我只是担心[\S\s]*
模式的性能。
我还认为,针对未找到匹配组的注释中报告的错误与链接演示中选择的正则表达式ECMAScript风格有关,使用PCRE可以正确报告匹配。
NB。
此模式将在提供的整个输入中考虑有效匹配。如果需要每行 匹配,则需要启用/g
全局标志并使用@anubhava答案!