如何构建一个正则表达式,该表达式将匹配包含任何字符但必须包含21个逗号的任何长度的字符串?
答案 0 :(得分:88)
/^([^,]*,){21}[^,]*$/
那是:
^ Start of string
( Start of group
[^,]* Any character except comma, zero or more times
, A comma
){21} End and repeat the group 21 times
[^,]* Any character except comma, zero or more times again
$ End of string
答案 1 :(得分:11)
如果你正在使用支持占有量词的正则表达式(例如Java),你可以这样做:
^(?:[^,]*+,){21}[^,]*+$
占有量词可以比贪心量词更好。
说明:
(?x) # enables comments, so this whole block can be used in a regex.
^ # start of string
(?: # start non-capturing group
[^,]*+ # as many non-commas as possible, but none required
, # a comma
) # end non-capturing group
{21} # 21 of previous entity (i.e. the group)
[^,]*+ # as many non-commas as possible, but none required
$ # end of string
答案 2 :(得分:7)
迭代字符串可能更快,更容易理解,计算找到的逗号数量,然后将其与21进行比较。
答案 3 :(得分:6)
正好是21个逗号:
^([^,]*,){21}[^,]$
至少21个逗号:
^([^,]?,){21}.*$
答案 4 :(得分:1)
^(?:[^,]*)(?:,[^,]*){21}$
答案 5 :(得分:1)
如果完全是21:
/^[^,]*(,[^,]*){21}$/
如果至少21:
/(,[^,]*){21}/
但是,我建议不要使用正则表达式来完成这么简单的任务。因为它很慢。
答案 6 :(得分:0)
用什么语言?可能有一种更简单的方法。
例如......
在CFML中,您可以看到ListLen(MyString)
是否为22
在Java中,您可以将MyString.split(',')
与22
等...
答案 7 :(得分:0)
var valid = ((" " + input + " ").split(",").length == 22);
...或
var valid = 21 == (function(input){
var ret = 0;
for (var i=0; i<input.length; i++)
if (input.substr(i,1) == ",")
ret++;
return ret
})();
表现优于......
var valid = (/^([^,]*,){21}[^,]*$/).test(input);
答案 8 :(得分:-9)
.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,