You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式匹配重复模式的最后一次出现?

匹配最后一个重复模式的正则解决方案

没问题,我来帮你搞定这个匹配最后一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:51:11