Ruby Regex 非贪婪匹配 : looking for the closest occurrence of a phrase left to a searched word

标签 ruby regex

假设我有以下字符串:"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”。我怎样才能做到这一点?一个想法是反转字符串,我应该这样做吗?

最佳答案

您需要确保 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

关于Ruby Regex 非贪婪匹配 : looking for the closest occurrence of a phrase left to a searched word,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21659120/

相关文章:

ruby - Ruby 兰特的有效种子范围是多少?

mysql - Ruby:Mysql 时间戳/日期时间问题

regex - 不使用正则表达式用空格替换减号(-)的问题

regex - 加快正则表达式匹配?

python - 正则表达式:允许包含 "foo"的字符串,但如果同一字符串也包含 "bar",则不允许

javascript - 用引号分割文本而不是javascript中的空格

ruby - 如果 Ruby 不存在则创建目录

ruby - "self"如何在方法内的 Enumerable block 内工作

arrays - 来自数组的破坏性拒绝返回被拒绝的值

java使用正则表达式从字符串中删除模式