我正在努力想出一个用逗号分隔的整数列表的正则表达式,范围在1-9999之间。
这是我到目前为止所做的:
"(^[1-9][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[1-9](,[1-9][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[1-9])*)$"
我不想允许空格而且不应以逗号结尾,所以应该只允许:
1,2,9999
1
43,5
答案 0 :(得分:5)
1到9999之间的整数可与
匹配(?:[1-9]|[1-9][0-9]{1,3})
与
同义[1-9][0-9]{0,3}
详细:
[1-9]
- 来自1-9
范围|
- 或[1-9][0-9]{1,3}
- 从10
到9999
的整数。或
[1-9]
- 来自1-9
范围[0-9]{0,3}
- 任意0到3位数字因此,用逗号分隔的整数列表可以表示为:
\A(?:[1-9]|[1-9][0-9]{1,3})(?:,(?:[1-9]|[1-9][0-9]{1,3}))*\z
或更短的版本
\A[1-9][0-9]{0,3}(?:,[1-9][0-9]{0,3})*\z
<强>解释强>:
\A
- 明确的字符串开头[1-9][0-9]{0,3}
- 整数正则表达式块(?:
- 非匹配组的开头,它将匹配0个或更多个序列:
,
- 逗号[1-9][0-9]{0,3}
- 1
直到9999
整数正则表达式块)*
- 非捕获组的结束\z
- 字符串的明确非常结尾。在Swift或Objective C字符串模式中,您需要加倍反斜杠,例如
夫特:
var pattern = "\\A[1-9][0-9]{0,3}(?:,[1-9][0-9]{0,3})*\\z"
目标C:
NSString * pattern = @"\\A[1-9][0-9]{0,3}(?:,[1-9][0-9]{0,3})*\\z";
由于您需要验证字符串,因此您需要使用明确的锚点\A
和\z
。请注意,$
匹配字符串,即使它以LF符号结尾,因此,建议使用字符串锚\z
的最末端。
修改强>:
为了证明以下那些不相信上述Objective-C模式不起作用的人,这里有一个demo:
NSString * teststr = @"1,4,566";
NSString * pattern = @"\\A[1-9][0-9]{0,3}(?:,[1-9][0-9]{0,3})*\\z";
NSPredicate * tst = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
if ([tst evaluateWithObject:teststr]) {
NSLog (@"yes");
}
else
{
NSLog (@"no");
}
结果:yes
答案 1 :(得分:0)