Regex 正则表达式:为逗号分隔的值匹配无符号整数值(仅限有效值:0到65535)

Regex 正则表达式:为逗号分隔的值匹配无符号整数值(仅限有效值:0到65535),regex,regex-group,Regex,Regex Group,我有 它适用于单输入,如下所示: ([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5]) 但我希望它们用于逗号分隔的输入字符串,如下所示: 0,1,656553->这是一个有效字符串 65535,-1,25->这是一个无效字符串,因为是负数 有人能提出解决方案吗 注: 0 1 65 6553 它也接受65537,这是不可取的。之后检查数字边界对我来说似乎更简单,但无论如何,这是一个可以使用的正则表达式(我对整数部分进

我有

它适用于单输入,如下所示:

([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])
但我希望它们用于逗号分隔的输入字符串,如下所示:

0,1,656553
->这是一个有效字符串
65535,-1,25
->这是一个无效字符串,因为是负数

有人能提出解决方案吗

注:

0
1
65
6553

它也接受65537,这是不可取的。

之后检查数字边界对我来说似乎更简单,但无论如何,这是一个可以使用的正则表达式(我对整数部分进行了一点重构)

^([0-5]?\d{0,4}6[0-4]\d{3}65[0-4]\d{2}655[0-2]\d}6553[0-5])(,|(?=$)+$

详情:

  • ^
    :字符串开始
  • :组开始
    • ([0-5]?\d{0,4}6[0-4]\d{3}65[0-4]\d{2}655[0-2]\d}6553[0-5])
      :匹配一个数字
    • (,|(?=$)
      :匹配
      ,或确保这是行尾(但不读取
      $
  • )+
    :结束分组,尽可能重复多次
  • $
    :字符串结尾
您可以使用

I have already tried repetition as:
^([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])+(,(([0-5]?\d?\d?\d?\d|6[0-4]\d\d\d|65[0-4]\d\d|655[0-2]\d|6553[0-5])))*$
在PCRE和ONIGOM中,您可以使用较短的模式,其中
\g
重复组1模式:

^(?:\d{1,4}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])(?:,(?:\d{1,4}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))*$
^(\d{1,4}|[1-5]\d{4}| 6[0-4]\d{3}| 65[0-4]\d{2}| 655[0-2]\d}6553[0-5])(?:,\g)*$
参见和

正则表达式基本上是
^(?:,)*$
,其中块模式是与
0
65535
之间的数字相匹配的正则表达式:

  • \d{1,4}
    -1,2,3或4位(
    0
    -
    9999
  • [1-5]\d{4}
    -
    1
    5
    位,然后是任意4位(
    10000
    -
    50000
  • 6[0-4]\d{3}
    -
    6
    ,然后是从
    0
    4
    的一个数字,然后是三个数字(
    60000
    -
    64999
  • 65[0-4]\d{2}
    -
    65
    ,一个从
    0
    4
    的数字,然后是任意两个数字(
    65000
    -
    65499
  • 655[0-2]\d
    -
    655
    ,一个从
    0
    2
    的数字,然后是任意数字(
    65500
    -
    655299
  • 6553[0-5]
    -
    6553
    然后是一个从
    0
    5
    的数字(
    65530
    -
    65535
一般模式:

  • ^
    -字符串的开头
  • -上述块模式
  • (?:,)*
    -0或更多次重复
    ,然后块模式
  • $
    -字符串结束

设置全局修饰符时,第一个示例模式的工作方式与您描述的方式相同。
)+(,
中的加号不应该在那里(上一个正则表达式的一半):您不希望第一部分重复;任何“重复”应该使用正则表达式的后半部分,而不是前半部分来实现。如果只想匹配一系列整数值,则正则表达式可能不是最佳选择。您可能希望使用正则表达式获取字符串中的所有整数,然后检查它们的值。为什么要使用正则表达式来执行此操作?
^(\d{1,4}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])(?:,\g<1>)*$