我有以下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"
我不清楚的是,为什么第一个[[:digital:]]后面的星号也允许在字符串的开头传递字符:
irb > "a3".match(/A[[:digit:]]*+((.|,)[[:digit:]]+)?Z/)
=> #<MatchData "a3" 1:"a3" 2:"a">
我怎么能让它只匹配数字?
.
是一个regexp元字符,它匹配您在替换中需要转义的任何字符(换行符除外):
data.to_s.match(/A[[:digit:]]*((.|,)[[:digit:]]+)?Z/) ? true : false
# this dot needs escaping ^
此外,在第一个*
之后的+
是冗余的(零或多个数字的一个或多个重复)。此外,ruby有一个较短的友好方式来表示[[:digit:]]
:d
。由于这是一个完整的字符串匹配,您真的想在字符串末尾允许n
吗?如果没有,则使用z
而不是Z
data.to_s.match(/Ad*((.|,)d+)?z/) ? true : false
正则表达式中的.
匹配任何字符,需要转义为.
:
data.to_s.match(/A[[:digit:]]*+((.|,)[[:digit:]]+)?Z/) ? true : false