我需要在字符串中找到两个连续单词的所有组,但只有具有2-3个字符长度的单词。到目前为止,我已经来了:
'toolong fee fi fo fum toolong verylong aa bb'.scan(/\b[a-z]{2,3}\s+\b[a-z]{2,3}/)
=> ["fee fi", "fo fum", "aa bb"]
但我想要这样的事情:
=> ["fee fi", "fi fo", "fo fum", "aa bb"]
非常感谢任何帮助。
答案 0 :(得分:2)
您需要使用前瞻以及按顺序捕获组来进行重叠匹配。
> 'toolong fee fi fo fum toolong verylong aa bb'.scan(/(?=\b([a-z]{2,3}\s+[a-z]{2,3})\b)/)
=> [["fee fi"], ["fi fo"], ["fo fum"], ["aa bb"]]
> 'toolong fee fi fo fum toolong verylong aa bb'.scan(/\b(?=([a-z]{2,3}\s+[a-z]{2,3})\b)/).flatten
=> ["fee fi", "fi fo", "fo fum", "aa bb"]
答案 1 :(得分:1)
逻辑方法是消耗前3个ltr字,然后预测为 下一个。
既然你想把两个词放在一起,你就会抓住每个词然后加入
他们在每场比赛后一起。 \b([a-z]{2,3})(?=(\s+[a-z]{2,3})\b)
\b
( [a-z]{2,3} ) # (1)
(?=
( # (2 start)
\s+
[a-z]{2,3}
) # (2 end)
\b
)
下一个合乎逻辑的方式(虽然不直观)是为了向前看
合并2个单词,然后消耗第一个单词以提前匹配
位置。 (?=\b(([a-z]{2,3})\s+[a-z]{2,3})\b)\2
通过这种方式,您只需抓住第1组而无需加入。
(?=
\b
( # (1 start)
( [a-z]{2,3} ) # (2)
\s+
[a-z]{2,3}
) # (1 end)
\b
)
\2