Ruby风格的Regex:A[[:digital:]]*接受字符串开头的字符



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

相关内容

最新更新