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
之间的数字相匹配的正则表达式:
-1,2,3或4位(\d{1,4}
-0
)9999
-[1-5]\d{4}
到1
位,然后是任意4位(5
-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>)*$