正则表达式的OR运算符不起作用

时间:2018-01-17 12:54:36

标签: regex validation

我有一种正则表达式,应该按照这种方式匹配输入:

123 -> Correct
123,456 -> Correct
012 -> Incorrect
012,345 -> Incorrect

我正在尝试使用以下正则表达式实现此目的:

([1-9][0-9]*)|([1-9][0-9]*[,][0-9]{1,3})

OR运算符由于某种原因不起作用。另外两者都正常,但不是在一起。为什么呢?

2 个答案:

答案 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})?$

https://regex101.com/r/Jo41jj/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}