我有一种正则表达式,应该按照这种方式匹配输入:
123 -> Correct
123,456 -> Correct
012 -> Incorrect
012,345 -> Incorrect
我正在尝试使用以下正则表达式实现此目的:
([1-9][0-9]*)|([1-9][0-9]*[,][0-9]{1,3})
OR运算符由于某种原因不起作用。另外两者都正常,但不是在一起。为什么呢?
答案 0 :(得分:3)
你需要添加行分隔符,正则表达式将尝试匹配字符串上的任何位置(因此,忽略它以0开头的事实):
^(([1-9][0-9]*)|([1-9][0-9]*[,][0-9]{1,3}))$
https://regex101.com/r/bELIFk/1
(请注意,在您的示例中,([1-9][0-9]*[,][0-9]{1,3})
与最后一个样本匹配,这意味着OR运算符不是问题)
但我认为,这是你想用更简单的版本做的事情:
^[1-9]\d*(,\d{1,3})?$
答案 1 :(得分:1)
您提供的regex
符合您的字符串。由于它不包含任何anchor,因此它匹配输入字符串的片段。
它匹配来自12
的{{1}}和来自012
的{{1}}。
如果您希望它匹配整个字符串(或失败),则必须将其括在12,345
(匹配字符串的开头)和012,345
(匹配字符串的结尾)。
正确的^
是:
$
逗号(regex
)不是^([1-9][0-9]*)|([1-9][0-9]*[,][0-9]{1,3})$
中的特殊字符,不需要将其放在范围内。 ,
与regex
相同。
逗号之前的片段在两个子表达式上都很常见。您可以使用zero or one repetition operator (?
)编写与数字(,
)匹配的表达式(可选[,]
),后跟逗号和1到3位数([1-9][0-9]*
)。
(...)?
是:
,[0-9]{1,3}