1

私は次のRubyフレーバーの正規表現を持っています:

data.to_s.match(/\A[[:digit:]]*+((.|,)[[:digit:]]+)?\Z/) ? true : false

これは、意図したとおりに次の例に対してtrueを返します。

data = "13"
data = "1,3"
data = "13,3"
data = "1.3"
data = ",3"
data = ".3"

私にはわかりませんが、最初の[[:digit:]]の後のアステリックスでも、文字列の先頭に文字を渡すことができるのはなぜですか。

irb > "a3".match(/\A[[:digit:]]*+((.|,)[[:digit:]]+)?\Z/)
=> #<MatchData "a3" 1:"a3" 2:"a">

数字だけに一致させるにはどうすればよいですか?

4

2 に答える 2

3

.は、交互にエスケープする必要のある任意の文字(改行を除く)に一致する正規表現メタ文字です。

data.to_s.match(/\A[[:digit:]]*((\.|,)[[:digit:]]+)?\Z/) ? true : false
# this dot needs escaping         ^

また、+最初のアフター*は冗長です(0桁以上の1回以上の繰り返し)。また、ルビーには、より短い親しみやすい言い方があります[[:digit:]]\d。これは文字列全体の一致なので、\n文字列の最後で本当に許可しますか?そうでない場合は\z\Z

data.to_s.match(/\A\d*((\.|,)\d+)?\z/) ? true : false
于 2013-02-20T22:59:25.790 に答える
1

正規表現内の.は任意の文字と一致しており、次のようにエスケープする必要があります\.

data.to_s.match(/\A[[:digit:]]*+((\.|,)[[:digit:]]+)?\Z/) ? true : false
于 2013-02-20T22:52:34.150 に答える