在字符串中查找所有连续单词组

时间:2015-11-09 16:24:06

标签: ruby regex

我需要在字符串中找到两个连续单词的所有组,但只有具有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"]

非常感谢任何帮助。

2 个答案:

答案 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