带有 0 或 1 的正则表达式数字 - 后跟数字
Posted
技术标签:
【中文标题】带有 0 或 1 的正则表达式数字 - 后跟数字【英文标题】:Regex Numbers with 0 or 1 - follow by numbers 【发布时间】:2019-08-12 20:00:32 【问题描述】:我正在尝试匹配此字符串,但我没有开始工作。字符串只能包含数字或带有 1 个破折号后跟另一组数字的数字。
我的正则表达式:
^([0-9]*|[0-9]*\-1[0-9]*)$
前:
这张通行证
123
这一关
123-123
这应该失败,但它正在通过
123-
【问题讨论】:
正则表达式中的*
表示零个或多个。 123-
在破折号后面有零个或多个数字。
-123
有效吗? 123--123
有效吗?
【参考方案1】:
这应该是最简单和最有效的方法:
^\d+(?:-\d+)?$
^[0-9]+(?:-[0-9]+)?$
*
\d
是大多数正则表达式风格中可用的字符集,代表[0-9]
。这是一种更简洁的数字匹配方式,但如果您更喜欢[0-9]
,您可以直接使用它。
请注意,您的原始模式和其他人作为答案提供的模式在连字符后包含量词 1
。这应该避免,因为它总是多余的。没有量词的单个字符等价于同一个字符后跟1
。
*编辑:Wiktor 提出了一些我不知道的事情。在某些正则表达式风格中,\d
包括所有 unicode 数字,而不仅仅是数字 0 到 9。如果这是一个问题,您可以使用模式 ^[0-9]+(?:-[0-9]+)?$
【讨论】:
提防strings like๔๕๖๗๘๙໐໑-௫௬௭௮
。
@WiktorStribiżew 不知道!在我的回答中添加了注释。【参考方案2】:
你很亲密!
*
量词匹配 0 个或多个数字。
您要查找的是匹配 1 个或多个数字的 +
量词。
修改你的例子:
^([0-9]*|[0-9]+\-1[0-9]+)$
将不匹配任何内容、单个数字或数字-数字
【讨论】:
【参考方案3】:您需要了解正则表达式的不同部分在做什么。 *
表示零或任何数字的某个符号,在你的例子中是一个数字。
如果您希望破折号后至少有一个数字,请使用 +
而不是星号。
^([0-9]*|[0-9]*\-1[0-9]+)$
【讨论】:
【参考方案4】:^[0-9]+(-[0-9]+)*$
^[0-9]+
以一个或多个数字开头
(-[0-9]+)*
0 次或 1 次破折号后跟长度为 1 或更多的数字
【讨论】:
【参考方案5】:为了好玩,这里有一些无正则表达式的答案。我发现它们更容易阅读。
如果 -123
和 123--123
不允许:
s.Split('-').All(x => x != string.Empty && x.All(char.IsDigit));
对于-
之间的元素,我们检查该元素不为空且仅由数字组成。
如果允许-123
和123--123
:
!s.EndsWith("-") && s.All(c => c == '-' || char.IsDigit(c));
检查字符串s
不以-
结尾,并且s
仅由-
和数字组成。
Try it online!
请注意,char.IsDigit
将允许 ๔๕๖๗๘๙໐໑-௫௬௭௮
。如果您不想匹配此替换 char.IsDigit()
与 IsDigit()
:
public static bool IsDigit(char c) => c >= '0' && c <= '9';
【讨论】:
以上是关于带有 0 或 1 的正则表达式数字 - 后跟数字的主要内容,如果未能解决你的问题,请参考以下文章