【问题标题】:Ruby Regex non-greedy match: looking for the closest occurrence of a phrase left to a searched wordRuby Regex 非贪婪匹配:寻找与搜索词最接近的短语
【发布时间】: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”。我怎样才能做到这一点?一个想法是反转字符串,我应该这样做吗?

【问题讨论】:

    标签: ruby regex


    【解决方案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?
    • 在非捕获组中包含负前瞻是一个非常好的主意 - 特别是如果像我一样,您正在修复现有系统中的错误并且后面的逻辑取决于确切的集合的捕获。投赞成票!
    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多