1

我试图找出后面只有“..”的字符串,但找不到:

["..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"]
4

5 回答 5

5

你想要的是

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

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

>> /^\.\.(?!\.)/.match "..ab"
=> #<MatchData "..">
>> /^\.\.(?!\.)/.match "...cc"
=> nil
于 2013-02-04T20:59:17.873 回答
2

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

ss = ["..ab","...cc","..ps","....kkls"]
ss.select { |x| x =~ /^\.\.[^\.]/ } # => ["..ab", "..ps"] 
于 2013-02-04T20:58:37.430 回答
2

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

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

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

{2}表示您正在寻找其中两个点。(你可以重写/\.{2}//\.\./

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

一个非常好的测试 Ruby 正则表达式的地方是http://rubular.com/——它可以让你使用正则表达式并在你的浏览器中测试它。

于 2013-02-04T21:02:09.893 回答
1

您根本不需要正则表达式,您可以使用String#[]or提取适当的前导块String#slice并进行简单的字符串比较:

>> a = ["..ab", "...cc", "..ps", "....kkls", ".", "..", "..."]
>> a.select { |s| s[0, 2] == '..' && s[0, 3] != '...' }
=> ["..ab", "..ps", ".."]
于 2013-02-04T21:41:31.053 回答
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) }
于 2013-02-04T20:58:22.693 回答