正则表达式:匹配重复模式的最后一次出现

时间:2018-03-23 14:08:32

标签: regex

有没有办法编写一个与重复模式的最后一次出现相匹配的正则表达式。例如:

使用以下文字:

  

服务器名{abc.com;随机文本;} server_name {xyz.com;更多文字;}

匹配应为 server_name {xyz.com;更多文字;}

并附上文字:

  

服务器名{abc.com;随机文本;} server_name {cde.com更随机   text;} server_name {xyz.com;更多文字;}

匹配仍然是 server_name {xyz.com;更多文字;}

{}之间的东西可能会有所不同。并且正则表达式将始终只匹配最后一个模式与server_name {此处的任何文本;}

我一直在使用https://www.regexpal.com/进行测试 以下正则表达式匹配所有server_name {} -patterns,而不仅仅是最后一个。我试图使用负面前瞻而没有运气。

server_name\{(.|\n)+?;\}

2 个答案:

答案 0 :(得分:4)

编辑:此答案依赖于PCRE,Perl和其他人提供的\K令牌,因为OP未指定其正则表达式的风格。

.*\K添加到正则表达式的开头。它匹配任意数量的任何字符,然后重置报告的匹配。

根据ctwheels的建议,我已将您的(.|\n)更改为[\s\S](匹配任何空格或非空白字符)。

完整的正则表达式:

.*\Kserver_name\{[\s\S]+?;\}

在线试用here

答案 1 :(得分:3)

尝试使用否定lookahead (?!,声明模式server_name{[^}]+})不再出现。

server_name{[^}]+}(?!.*server_name{[^}]+})

匹配

  • server_name按字面意思匹配
  • {[^}]+}匹配{,不匹配}一次或多次匹配}。例如,匹配{abc.com; random text;}
  • (?!否定前瞻,断言右侧是什么
    • .*server_name{[^}]+}匹配任何字符零次或多次,然后匹配您的模式
  • )关闭前瞻