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         ^

此外,+第一个之后*是多余的(零个或多个数字的一​​个或多个重复)。ruby 也有一种更简短友好的说法[[:digit:]]\d。由于这是一个完整的字符串匹配,你真的想\n在字符串末尾允许吗?如果没有,请使用\zover\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 回答