读书人

请问一个正则表达式连续5个整数每

发布时间: 2012-04-01 17:23:46 作者: rapoo

请教一个正则表达式,连续5个整数,每个整数取值0-65535,整数间逗号隔开
请教一个正则表达式,连续5个整数,每个整数取值0-65535,整数间逗号隔开,
如0,1,65535,2,65534

下面的情况时不满足表达式要求的
少位数:0,1,65535,2,
多位数:0,1,65535,2,0,1
溢出范围:0,1,6523535,2,0,1


我这么写不行:[0-65535],[0-65535],[0-65535],[0-65535],[0-65535]

请大家赐教,谢谢。

[解决办法]
用正则表达式表示数值范围很不方便,建议你先用正则表达式匹配5个整数,再检查匹配的结果。


[解决办法]
\b[0-6]?[0-5]?[0-5]?[0-3]?[0-5]\b
[解决办法]
用python不是很简单就搞定了,如果数据量不大不考虑性能的话
[解决办法]

探讨
\b[0-6]?[0-5]?[0-5]?[0-3]?[0-5]\b

[解决办法]
0-9 \d
10-99 [1-9]\d
100-999 [1-9]\d{2}
1000-9999 [1-9]\d{3}
10000-59999 [1-5]\d{4}

0-59999范围的正则合并一下就是[0-5]?\d?\d?\d?\d

60000-64999 6[0-4]\d{3}
65000-65499 65[0-4]\d{2}
65500-65529 655[0-2]\d
65530-65535 6553[0-5]

0-65535范围的正则为6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]|[0-5]?\d?\d?\d?\d

针对多位数的情况0,1,65535,2,0,1需要在正则两头加上锚点(?<!,)和(?!,)

Perl code
#!/usr/bin/perlmy $num_range_re = qr#\b(?:6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]|[0-5]?\d?\d?\d?\d)\b#;my $all_re = qr#\b(?<!,)(?:(?:$num_range_re\,){4}(?:$num_range_re))(?!,)\b#;while (<DATA>){    chomp;    if (/($all_re)/)    {        print $1;        print "\n";    }    else    {        print "$_ is invalid num\n";    }} __DATA__0,1,65535,2,0,1,65535,2,0,10,1,6523535,2,0,10,0,0,0,065535,65535,65535,65535,65535 

读书人网 >perl python

热点推荐