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

あなたが欲しいのは

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

^冒頭のカレットは、文字列の先頭と一致することを意味します。\.正規表現ではプレーンピリオド.は任意の文字と一致するため、ピリオドはバックスラッシュでエスケープする必要があります。これ(?!\.)は負の先読みであり、次の文字がピリオドではないことを意味します。したがって、この表現は、「文字列の先頭で、2つのピリオドに一致し、その後にピリオドではない文字が続く必要がある」ことを意味します。

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

/^\.{2}\w/正規表現として使用してみてください。

簡単な説明:^は文字列の始まりを意味します。これがないと、文字列の中央にあるドットと一致する可能性があります。

\.に変換され.ます-ドットを単独で使用すると、改行以外の文字と一致します

{2}ドットの2つを探していることを意味します。/\.{2}/(次のように書き直すことができます/\.\./

最後に、\w任意の単語文字(文字、数字、アンダースコア)に一致します。

Rubyの正規表現をテストするのに最適な場所はhttp://rubular.com/です。これを使用すると、正規表現を試して、ブラウザーで直接テストできます。

于 2013-02-04T21:02:09.893 に答える
2

オンを選択してみてください/^\.\.[^\.]/(2つのドットで始まり、ドットではありません)。

ss = ["..ab","...cc","..ps","....kkls"]
ss.select { |x| x =~ /^\.\.[^\.]/ } # => ["..ab", "..ps"] 
于 2013-02-04T20:58:37.430 に答える
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 に答える