我想检查并捕获多行文本中目标字符串之前和之后的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
答案 0 :(得分:2)
由于你想捕获 target 之前和之后的单词,你需要在整个正则表达式部分周围设置一个匹配0到2个空格的捕获组 - 非空间。此外,您需要允许0
的最小范围 - 使用{0,2}
(或更多succint {,2}
)限制量词,以确保您在左侧获得上下文,即使它已丢失在右边:
/((?:\S+\s+){,2})target((?:\s+\S+){,2})/
^ ^ ^ ^
如果你使用/(?:(\S+)\s+){0,2}target(?:\s+(\S+)){0,2}/
,所有捕获的值都将丢失,即一旦被量化,重复捕获组只会将最后一次迭代中捕获的值存储在组缓冲区中。
另请注意,在{,2}
量词上设置+
量词毫无意义,\\s+{,2}
= \\s+
。