2017-11-11 296 views
1

我正在使用Ruby 2.1。我有這樣的邏輯,看起來連續字符串對在一個更大的字符串如何判斷在正則表達式中匹配之間是否有三個或更多的字符?

results = line.scan(/\b((\S+?)\b.*?\b(\S+?))\b/) 

我的問題是,我該如何遍歷結果列表中,並打印出是否有兩個字符串之間的三個或更多字符?舉例來說,如果我的字符串是

"abc  def" 

以上會產生

[["abc  def", "abc", "def"]] 

,我想知道是否有「ABC」和之間的三個或更多字符「高清」。

+1

你參考(這是符合你的正則表達式),但你的榜樣「兩個字符串之間的三個或更多字符」只包含兩個字符串之間的空格(即一個特定字符)。這是令人困惑的。 –

+0

我正在使用與我的表達式匹配的示例。我在我的問題b/c中使用了「characters」而不是「spaces」,我的正則表達式可能會比空格匹配更多。請讓我知道我能做些什麼來使問題更清楚。感謝卡里。 – Dave

+0

@Dave除了空格還有什麼可能? – wp78de

回答

3

使用量詞的空間其間:\b((\S+?)\b\s{3,}\b(\S+?))\b

而且,實際上並不需要內boundries: \b((\S+?)\s{3,}(\S+?))\b

+0

你改變我的正則表達式。我不想排除它們之間少於3個字符的對,我只是想確定當我遍歷結果集時哪些對是那些對。 – Dave

+0

戴夫,沒有必要引用你的「結果集」來產生你想要的結果。 wp78de正在提取兩個匹配之間有3個或更多空格的字符串(這些字符將位於結果集中),與您的示例一致。如果它們之間應該是「3或更多*字符*」,則用'。{3,}'替換'\ s {3,}'。 –

+0

@Dave如果你真的想要走這條路線,你可以使用這樣一個更復雜的模式,如果它們之間有3個或更多的空格,那麼它的價值在2美元:['\ b(?:(\ w +?) :?(\ S {3,...})| \ b * \ b)(\ W +))\ B'](https://regex101.com/r/v3oG9M/3) – wp78de

0

一個簡單的方法來檢查,這是通過運行一個獨立的正則表達式:

results.select!{|x|p x[/\S+?\b(.*?)\b\S+?/,1].size} 

將打印每一堆的大小。

另一種方法是把拍攝組的大小和減去它們:

results = [] 
line.scan(/\b((\S+?)\b.*?\b(\S+?))\b/) do |s, group1, group2| 
    results << $~ if s.size - group1.size - group2.size >= 3 
end 
相關問題