如何找到以“..”开头的字符串?

时间:2013-02-04 20:51:48

标签: ruby regex

我试图找到字符串,后面只有“..”,但无法得到:

["..ab","...cc","..ps","....kkls"].each do |x|
puts x if /../.match(x)
end
..ab
...cc
..ps
....kkls
=> ["..ab", "...cc", "..ps", "....kkls"]

["..ab","...cc","..ps","....kkls"].each do |x|
puts x if /(.)(.)/.match(x)
 end
..ab
...cc
..ps
....kkls
=> ["..ab", "...cc", "..ps", "....kkls"]

预期输出:

["..ab","..ps"]

5 个答案:

答案 0 :(得分:5)

你想要的是

/^\.\.(?!\.)/

开头的插入符^表示匹配字符串的开头;句点必须通过反斜杠转义为\.,因为在正则表达式中,普通句点.与任何字符匹配; (?!\.)是否定前瞻意味着下一个字符不是句号。所以表达式意味着“在字符串的开头,匹配两个句点,后面必须跟一个不是句号的字符。”

>> /^\.\.(?!\.)/.match "..ab"
=> #<MatchData "..">
>> /^\.\.(?!\.)/.match "...cc"
=> nil

答案 1 :(得分:2)

尝试选择/^\.\.[^\.]/(以两个点开头,然后不是一个点)。

ss = ["..ab","...cc","..ps","....kkls"]
ss.select { |x| x =~ /^\.\.[^\.]/ } # => ["..ab", "..ps"] 

答案 2 :(得分:2)

尝试使用/^\.{2}\w/作为正则表达式。

快速解释: ^表示字符串的开头。没有它,它可以匹配在字符串中间找到的点。

\.转换为. - 如果您自己使用点,它将匹配任何非换行符

{2}意味着你正在寻找两个点。 (您可以将/\.{2}/重写为/\.\./

最后,\w匹配任何单词字符(字母,数字,下划线)。

测试Ruby正则表达式的一个非常好的地方是http://rubular.com/ - 它允许您使用正则表达式并在浏览器中进行测试。

答案 3 :(得分:1)

根本不需要正则表达式,您只需使用String#[]String#slice提取相应的主要块,然后进行简单的字符串比较:

>> a = ["..ab", "...cc", "..ps", "....kkls", ".", "..", "..."]
>> a.select { |s| s[0, 2] == '..' && s[0, 3] != '...' }
=> ["..ab", "..ps", ".."]

答案 4 :(得分:0)

也许这个:

["..ab","...cc","..ps","....kkls"].each {|x| puts x if /^\.{2}\w/.match(x) }

或者如果你想确定。不匹配:

["..ab","...cc","..ps","....kkls"].each {|x| puts x if /^\.{2}[^\.]/.match(x) }