带有 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】:

为了好玩,这里有一些无正则表达式的答案。我发现它们更容易阅读。

如果 -123123--123 不允许:

s.Split('-').All(x => x != string.Empty && x.All(char.IsDigit));

对于-之间的元素,我们检查该元素不为空且仅由数字组成。

如果允许-123123--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 的正则表达式数字 - 后跟数字的主要内容,如果未能解决你的问题,请参考以下文章

捕获从“ NE”开始的正则表达式,后跟61到71之间的任何一位或两位数字

正则表达式匹配所有字符实例,除非后跟数字或单独

字符串的正则表达式以数字开头,后跟 + 字符

常用的正则表达式

JS正则验证数字格式2

正则表达式