Regex 数字的正则表达式(可选后跟逗号或连字符)

Regex 数字的正则表达式(可选后跟逗号或连字符),regex,Regex,我在这个网站上搜索了很多,但是我找不到我要找的东西。我有我需要的开始,但我不知道最后一部分。这就是我目前所拥有的 [0-9]+(,[0-9]+)+(-[0-9]+)* 在我的使用中,它接受由逗号分隔的网络端口和由连字符分隔的端口范围 80,443,10001-10003 这很好,但我不能让它只接受一个数字,比如80本身 我尝试过以下几种变体,但运气不佳: [0-9]|([0-9]+(,[0-9]+)+(-[0-9]+)*) [0-9] OR ([0-9]+(,[0-9]+)+(-[0-9]+

我在这个网站上搜索了很多,但是我找不到我要找的东西。我有我需要的开始,但我不知道最后一部分。这就是我目前所拥有的

[0-9]+(,[0-9]+)+(-[0-9]+)*
在我的使用中,它接受由逗号分隔的网络端口和由连字符分隔的端口范围

80,443,10001-10003
这很好,但我不能让它只接受一个数字,比如80本身

我尝试过以下几种变体,但运气不佳:

[0-9]|([0-9]+(,[0-9]+)+(-[0-9]+)*)
[0-9] OR ([0-9]+(,[0-9]+)+(-[0-9]+)*)
任何帮助都将不胜感激

谢谢。

您可以使用

[0-9]+(?:[-,][0-9]+)*

如果要确保字符串完全匹配,请添加
^
(字符串开头)和
$
(字符串结尾锚定):

要点:

  • [,-]
    -与
    -
  • (?:[-,][0-9]+)*
    -量词匹配零个或多个字符,而
    +
    匹配一个或多个符号。因此,这个结构匹配零个或多个
    -
    序列,后跟一个或多个数字
如果像
80-2-2-2-2这样的字符串不应匹配
,请使用

^\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*$

请参见

尝试这三个术语(作为您的示例):

或者对于第一个必须为非范围的任何数量的术语,例如
999123-456,12,13,20-30

^\d+(,\d+(-\d+)?)*$
或任何类型的任何数字,如
123-456,20-30,88,99100-102

^(\d+(-\d+)?(,|$))+$

你的正则表达式允许
99-1-1-1-1-1
,顺便说一句,
99-1-1-1-1
应该匹配。@Bohemian:因为括号中的
[0-9]+
,它不会匹配
99,,,,,,,,
。我还觉得这些字符串是“预过滤”的,不应该有“99-1-1-1…”。@WiktorStribi--好的,不是
99
。我承认,如果我理解的话,你可能不会得到
1-1-1-1
\d+([,-])?\d+*棒极了^(\d+(\d+)(,|$)+$效果很好。非常感谢。@WiktorStribiżew是的,。是的,会的,尽管我的正则表达式更复杂efficient@WiktorStribiżew效率不如可读性更令人担忧,尤其是对于已经很难阅读的regex。使组不被捕获也会增加混乱。除非每秒执行100次,否则可读的短正则表达式就可以了。还有一个问题就是程序员的效率。
^\d+(,\d+(-\d+)?)*$
^(\d+(-\d+)?(,|$))+$