【发布时间】:2016-09-09 19:39:57
【问题描述】:
我想在多行文本中检查和捕获目标字符串前后的 2 个或 x 个单词。问题是如果匹配的单词少于x个单词,那么正则表达式会切断最后一个单词并将其拆分到x。
例如
text = "This is an example /year"
如果示例是目标:
匹配数据:“is”、“an”、“/yea”、“r”
如果我在 /year 之后添加随机单词,它会正确匹配。
我该如何解决这个问题,以便如果存在少于 x 个单词就停在那里或为其余匹配返回空?
应该是这样的
匹配数据:“is”、“an”、“/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
【问题讨论】:
-
将
regex += "\\s+{,2}(\\S+)\\s+{,2}" * numLeft更改为regex += "(?:\\S+\\s+){0," + numLeft + "}"和"\\s+{,2}(\\S+)" * numRight更改为"(?:\\s+\\S+){0," + numRight + "}"。见ideone.com/7l7rBW -
-
@WiktorStribiżew 是的,将其更改为 "(?:(\\S+)\\s+){0,#{numLeft}}" 但它不捕获 2 个单词。前后只有1个。即使我增加 numLeft 和 numRight。实际上它甚至不匹配正确的单词
-
看here,它与
Bridge Station target a year匹配得很好。我还要记住,您的搜索词可以包含任何非空白符号。 -
这是重复捕获组的预期行为,一旦在量化组中,最后一次迭代中捕获的值仅存储在组缓冲区中。使用它like this。