我试图找到字符串,后面只有“..”,但无法得到:
["..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"]
答案 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) }