我正在尝试匹配此字符串,但是我没有工作。字符串只能包含数字或带破折号的数字,后跟另一组数字。
我的正则表达式:
^([0-9]*|[0-9]*\-{1}[0-9]*)$
EX:
此通行证
123
此通行证
123-123
这应该会失败,但是正在通过
123-
答案 0 :(得分:2)
这应该是最简单,最有效的方法:
^\d+(?:-\d+)?$
^[0-9]+(?:-[0-9]+)?$
*
\d
是大多数正则表达式中可用的字符集,代表[0-9]
。这是一种更简洁的数字匹配方式,但是如果您更喜欢[0-9]
,可以直接使用它。
请注意,您的原始模式和其他人作为此处答案提供的模式在连字符后包括了量词{1}
。应该避免这种情况,因为它总是多余的。没有量词的单个字符等效于相同字符,后跟{1}
。
*编辑:Wiktor提出了我不知道的内容。在某些正则表达式中,\d
包括所有unicode数字,而不仅仅是数字0到9。如果这是一个问题,则可以使用模式^[0-9]+(?:-[0-9]+)?$
答案 1 :(得分:1)
您需要了解正则表达式不同部分的功能。 *
表示零或某些符号的任何数字,在您的情况下为数字。
如果要在破折号后至少包含一个数字,请使用+
代替星号。
^([0-9]*|[0-9]*\-{1}[0-9]+)$
答案 2 :(得分:1)
您非常亲密!
*
量词匹配0或多个数字。
您要寻找的是+
匹配1个或多个数字的量词。
修改示例:
^([0-9]*|[0-9]+\-{1}[0-9]+)$
不匹配任何内容,单个数字或一个数字
答案 3 :(得分:0)
^[0-9]+(-[0-9]+)*$
^[0-9]+
以一个或多个数字开头
(-[0-9]+)*
出现零个或一个破折号,然后是长度为1或更大的数字
答案 4 :(得分:0)
有趣的是,这里提供了一些无正则表达式的答案。我发现它们更易于阅读。
如果不允许-123
和123--123
:
s.Split('-').All(x => x != string.Empty && x.All(char.IsDigit));
在-
之间的Foreach元素,我们检查该元素是否不为空,仅由数字组成。
如果允许-123
和123--123
:
!s.EndsWith("-") && s.All(c => c == '-' || char.IsDigit(c));
检查字符串s
是否以-
结尾,并且s
仅由-
和数字组成。
请注意,char.IsDigit
将允许๔๕๖๗๘๙໐໑-௫௬௭௮
。如果您不想与此匹配,请将char.IsDigit()
替换为IsDigit()
:
public static bool IsDigit(char c) => c >= '0' && c <= '9';