2017-12-01 1 views
0

私はRuby on Rails 5.1を使用しています。 Rubyでは、最初の文字が何かにマッチするが、後続のシーケンスがパターンにマッチしない場合に、文字列にマッチさせたいとはどうすればいいですか?つまり、配列の次の配列が配列の文字ではなく、他の2つの配列が続くことを条件として、数値と一致させたいと思います。ここに私の文字列...Rubyでは、文字に続くシーケンスがパターンと一致しないという条件で、文字と一致させたいと指定するにはどうすればよいですか?

2.4.0だ:010>トークン => [ ":" ""、 "'"]

ので、この文字列が一致しません

3:00 

":00"は配列の文字のパターンに2つの数字が続くためです。しかし、この文字列

3400 

は一致します。この文字列はまた

3:0 

にマッチしますし、何も上記に続かないので、これは

3 

にマッチします。 Rubyに適切な正規表現を書くにはどうすればいいですか?

答えて

1
string =~ /\A\d+(?!:\d{2})/ 

この正規表現は、意味:

  • \Aは、文字列の先頭に試合を固定します。
  • \d+は、「1つ以上の数字」を意味します。
  • (?!...)は、ネガティブ先読みです。角括弧に含まれるパターンがではないことを確認して、と一致するかどうかを確認します。
  • :\d{2}は、:の後に2桁を意味します。
0

最初の文字と残りの文字を別々にテストすることを考慮する必要があります。

def match_it?(str, first_char_regex, no_match_regex) 
    str[0].match?(first_char_regex) && !str[1..-1].match?(no_match_regex) 
end 

match_it?("0:00", /0/, /\A[:. ]cat\z/)   #=> true 
match_it?("0:00", /\d/, /\A[:. ]\d+\z/)   #=> false 
match_it?("0:00", /[[:alpha:]]/, /\A[:. ]\d+\z/) #=> false 

私はこれがうまくいくと信じており、単一の正規表現を使用する方法と比べてテストが簡単です。

+0

質問は多少あいまいでした:「私は**数字に**一致したい、後には一致しません...」。あなたの抽象化では、 "数"は* 1桁*であると仮定していますが、単一正規表現の方がより一般的です。 –

+0

例えば、あなたのメソッドは '10:00' **のような文字列が**一致しないようにするためにはうまくいきません。可能ですが、IMOは単なる正規表現を実行するよりも混乱します! 'match_it?(" 10:00 "、/ \ d /、/ \ A \ d *:\ d + \ z /)' –

+0

@Tom、あなたはおそらく正しいでしょう。私は質問の文字通りの解釈を取ったが、それを再読みすると、それは内部的に矛盾しているのが分かる。 "少し曖昧な"?主はいつもとても優しいです。 –

関連する問題