Ruby搜索字符串以匹配字符对

时间:2015-12-29 04:15:22

标签: ruby regex

我想匹配字符串中的字符对。让我们说字符串是: " zttabcgqztwdegqf&#34 ;.两个" zt"和" gq"匹配字符串中的字符对。

以下代码找到" 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来解决这个问题。

3 个答案:

答案 0 :(得分: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中的重叠伴侣:输出将正确为abbc

<强>怪异

如果正则表达式引擎没有消耗字符如何到达字符串的末尾?

在检查 Onigmo (ruby正则表达式引擎)后,在内部自动更进一步。大多数正则表达口味都以这种方式表现,例如javascript引擎需要程序员手动递增最后一个匹配索引。

答案 1 :(得分: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"]

答案 2 :(得分:0)

以下是一种不使用正则表达式的方法:

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