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

时间:2016-05-20 12:44:16

标签: 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]+)*)

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用

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

请参阅regex demo

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

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

请参阅another demo

要点:

  • [,-] - 与,-
  • 匹配的字符类
  • (?:[-,][0-9]+)* - *量词匹配零个或多个字符,而+匹配一个或多个符号。因此,此构造与,-零个或多个序列匹配,后跟一个或多个数字。

如果80-2-2-2-2之类的字符串不匹配,请使用

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

请参阅another demo

答案 1 :(得分:1)

尝试使用3个术语(作为示例):

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

或第一个必须是非范围的任意数量的术语,例如999,123-456,12,13,20-30

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

或任何数量的任何类型,例如123-456,20-30,88,99,100-102

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