如果字符串结束,正则表达式会削减字数

时间:2016-09-09 10:43:57

标签: ruby regex

我想检查并捕获多行文本中目标字符串之前和之后的2或x个单词。问题是如果匹配的单词小于x个单词,那么正则表达式会切断最后一个单词并将其拆分为x。

例如

text = "This is an example /year"

如果示例是目标:

  

匹配数据:"" ,""," / yea"," r"

如果我在/年后添加随机单词,它会正确匹配。

我怎么能解决这个问题,如果存在少于x个单词,那么就停在那里或者为其余的匹配返回空白?

所以它应该是

  

匹配数据:"" ,""," / year",""

def checkWords(target, text, numLeft = 2, numRight = 2)

target = target.compact.map{|x| x.inspect}.join('').gsub(/"/, '')

    regex = ""
    regex += "\\s+{,2}(\\S+)\\s+{,2}" * numLeft
    regex += target
    regex += "\\s+{,2}(\\S+)" * numRight

    pattern = Regexp.new(regex)
    matches = pattern.match(text)

    puts matches.inspect

end

1 个答案:

答案 0 :(得分:2)

由于你想捕获 target 之前和之后的单词,你需要在整个正则表达式部分周围设置一个匹配0到2个空格的捕获组 - 非空间。此外,您需要允许0的最小范围 - 使用{0,2}(或更多succint {,2})限制量词,以确保您在左侧获得上下文,即使它已丢失在右边:

/((?:\S+\s+){,2})target((?:\s+\S+){,2})/
 ^              ^      ^              ^

请参阅this Rubular demo

如果你使用/(?:(\S+)\s+){0,2}target(?:\s+(\S+)){0,2}/,所有捕获的值都将丢失,即一旦被量化,重复捕获组只会将最后一次迭代中捕获的值存储在组缓冲区中。

另请注意,在{,2}量词上设置+量词毫无意义,\\s+{,2} = \\s+