我有以下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">
我怎样才能让它只匹配数字?
答案 0 :(得分:3)
.
是一个正则表达式元字符,可以匹配任何字符(换行符除外),您需要在交替中转义它:
data.to_s.match(/\A[[:digit:]]*((\.|,)[[:digit:]]+)?\Z/) ? true : false
# this dot needs escaping ^
第一个+
之后的*
也是多余的(一个或多个重复零个或多个数字)。此外,ruby还有一个较短的友好方式来说[[:digit:]]
:\d
。由于这是一个完整的字符串匹配,你真的想在字符串末尾允许\n
吗?如果没有,请使用\z
而不是\Z
data.to_s.match(/\A\d*((\.|,)\d+)?\z/) ? true : false
答案 1 :(得分:1)
正则表达式中的.
匹配任何字符,需要转义为\.
:
data.to_s.match(/\A[[:digit:]]*+((\.|,)[[:digit:]]+)?\Z/) ? true : false