2015-11-09 66 views
2

我需要查找字符串中兩個連續字詞的所有組,但僅包含長度爲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"] 

任何幫助極大的讚賞。

+1

Downvoter:care to comment? –

回答

2

您需要使用lookahead和捕獲組按順序進行重疊匹配。

> '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

將第一個'\ b'移到外面稍作改進。 '\ b(?='...沒有必要向前看每個位置 –

+0

我喜歡這個,謝謝!作爲一個小的簡化,我會在最後使用'flatten',而不是'map'。 –

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 
相關問題