如何编写正则表达式匹配重复模式的最后一次出现?
匹配最后一个重复模式的正则解决方案
没问题,我来帮你搞定这个匹配最后一个server_name{...}块的需求!
问题分析
你之前用的正则server_name\{(.|\n)+?;\}之所以会匹配所有块,是因为惰性匹配+?会在找到第一个;}就停止,然后正则引擎会继续在剩余文本里寻找下一个匹配项,所以会把所有符合的块都找出来。要只匹配最后一个,我们需要让正则“知道”后面不会再有新的server_name{开头的块了。
解决方案正则
这里给你一个可以直接用的正则:
server_name\{[\s\S]+?;\}(?!.*server_name\{)
正则拆解
让我给你拆解一下每个部分的作用:
server_name\{:精准匹配固定开头的server_name{,注意{是正则元字符,所以要加反斜杠转义[\s\S]+?;}:匹配大括号内的所有内容直到结尾的;}:[\s\S]等价于(.|\n),但写法更简洁,用来匹配任意字符(包括换行)+?是惰性量词,确保我们匹配到第一个出现的;}(也就是当前块的结尾)
(?!.*server_name\{):这是关键的负前瞻断言,意思是“匹配位置的后面,不能存在任何server_name{的内容”,这样就保证了我们匹配到的是最后一个server_name{...}块
测试验证
用你给出的两个测试文本验证:
测试文本1:
server_name{abc.com; random text;} server_name{xyz.com; more text;}
匹配结果:仅匹配server_name{xyz.com; more text;}
测试文本2:
server_name{abc.com; random text;} server_name{cde.com more random text;} server_name{xyz.com; more text;}
匹配结果:仅匹配server_name{xyz.com; more text;}
额外说明
如果你的场景里,大括号内的内容可能包含;}(比如有嵌套或者特殊文本),那这个正则可能会提前终止匹配。这种情况下你可能需要更复杂的逻辑,但根据你给出的示例,这个正则完全能满足需求。
内容的提问来源于stack exchange,提问作者jjei
相关产品推荐
相关产品推荐

