2015-12-29 153 views
0

我想匹配字符串中的字符對。假設字符串是: 「zttabcgqztwdegqf」。 「zt」和「gq」都是字符串中匹配的字符對。Ruby搜索匹配字符對的字符串

下面的代碼查找「ZT」匹配對,但不包括「GQ」對:

#!/usr/bin/env ruby 
string = "zttabcgqztwdegqf" 
puts string.scan(/.{1,2}/).detect{ |c| string.count(c) > 1 } 

的代碼提供的匹配對,其中對索引爲0 & 1,2 & 3, 4 & 5 ...而不是1 & 2,3 & 4,5 & 6等:

zt 
ta 
bc 
gq 
zt 
wd 
eg 
qf 

我不是在Ruby中確定的正則表達式是最好的一段路要走。但我想用Ruby來解決這個問題。

+0

我不知道我的理解,我只是回答了這個問題。 :-)。標題是指「匹配字符對」。你能否定義(編輯)?此外,你想要的輸出只是數組''「zt」,「ta」,「bc」,「gq」,「zt」,「wd」,「eg」,「qf」]'相鄰的弦加入)? –

+0

假設字符串是「ttabcttttdefttbcbcbc」。你想要的輸出是什麼? –

+0

@CarySwoveland:如果我理解正確,他希望找到在字符串內部重複出現的每個字符(也是重疊字符),他的問題與正則表達式引擎每次消耗兩個字符有關,所以奇怪對不會被提取。 –

回答

3

你可以用一個正則表達式做你的搜索:

puts string.scan(/(?=(.{2}).*\1)/) 

regex101 demo

輸出

ZT
GQ

正則表達式突圍

(?=  # Start a lookahead 
    (.{2}) # Search any couple of char and group it in \1 
    .*\1 # Search ahead in the string for another \1 to validate 
)   # Close lookahead 

注意

把內先行所有的檢查確保正則表達式引擎時驗證它不消耗夫婦。 所以它也適用於字符串abcabc中的重疊對夫婦:輸出將正確地爲ab,bc

怪異

如果正則表達式引擎不消耗字符如何才能到達字符串的結尾?

內部檢查後Onigmo(紅寶石正則表達式引擎)自動進一步。大多數正則表達式都以這種方式表現,但例如JavaScript引擎需要程序員手動增加最後的匹配索引。

+1

這個問題太可怕了。我多次閱讀你的答案,並理解這個問題。 – sawa

+0

@CarySwoveland:我已經更新了答案,以消除缺陷,感謝評論 –

+0

非常好,比我想出的更好。 –

1
str = "ztcabcgqzttwtcdegqf" 

r =/
    (.) # match any character in capture group 1 
    (?= # begin a positive lookahead 
    (.) # match any character in capture group 2 
    .+ # match >= 1 characters 
    \1 # match capture group 1 
    \2 # match capture group 2 
    ) # close positive lookahead 
    /x # extended/free-spacing regex definition mode 

str.scan(r).map(&:join) 
    #=> ["zt", "tc", "gq"] 
0

這裏是要做到這一點,而無需使用正則表達式的一種方式:

string = "zttabcgqztwdegqf" 
p string.split('').each_cons(2).map(&:join).select {|i| string.scan(i).size > 1 }.uniq 
#=> ["zt", "gq"]