Ruby Regex 非贪婪匹配:寻找与搜索词最接近的短语

Posted

技术标签:

【中文标题】Ruby Regex 非贪婪匹配:寻找与搜索词最接近的短语【英文标题】:Ruby Regex non-greedy match: looking for the closest occurrence of a phrase left to a searched word 【发布时间】:2014-03-06 17:12:00 【问题描述】:

假设我有以下字符串:"BENffew123X\r\nBENx432f456X\r\nBEN!233789X\r\nBEN4545789X" 我想要一个能够捕获“BEN!233789”的正则表达式,它必须非贪婪地查找“BEN”,然后是任何字符(不包括单词“BEN”)并以 789X 结尾。我尝试了正则表达式:/BEN.+?789X/mi,我得到了"BENffew123X\r\nBENx432f456X\r\nBEN!233789X" 作为匹配项。 我知道这个正则表达式查找第一个“BEN”并捕获字符串的开头,但我希望它查找最接近第一个“789X”的“BEN”。我怎样才能做到这一点?一个想法是反转字符串,我应该这样做吗?

【问题讨论】:

【参考方案1】:

您需要确保BEN 不存在于BEN789X 之间的文本中。您可以使用negative lookahead assertion:

/BEN(?:(?!BEN).)*?789X/mi

看live on regex101.com。

解释:

BEN      # Match "BEN"
(?:      # Start of non-capturing group that matches...
 (?!BEN) # (if "BEN" can't be matched here)
 .       # any character
)*?      # Repeat any number of times, as few as possible
789X     # Match 789X

【讨论】:

*? 是什么意思? 非贪婪的*(正如评论所说的“尽可能少”)。 @ArupRakshit:“零次或多次重复 (*),尽可能少 (?)”。因此,如果您有 BEN...789X...789X,它将在第一个 789X 处停止匹配。 @TimPietzcker 谢谢。我现在明白了 - how to make Regular expression into non-greedy? 在非捕获组中包含负前瞻是一个非常好的主意 - 特别是如果像我一样,您正在修复现有系统中的错误并且后面的逻辑取决于确切的集合的捕获。投赞成票!

以上是关于Ruby Regex 非贪婪匹配:寻找与搜索词最接近的短语的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:最小可能匹配或非贪婪匹配

非贪婪的 NSRegularExpression

正则表达式将字符串限制为最短匹配与最长匹配(非贪婪组)?

正则表达式?非贪婪匹配

正则表达式?非贪婪匹配

正则贪婪和非贪婪