Ruby风格的正则表达式:A [[:digit:]] *接受字符串开头的字符

时间:2013-02-20 22:50:23

标签: ruby regex

我有以下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">

我怎样才能让它只匹配数字?

2 个答案:

答案 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
相关问题