Как создать регулярное выражение, которое будет соответствовать строке любой длины, содержащей любые символы, но должно содержать 21 запятую?
Регулярное выражение для подсчета числа запятых в строке
Ответ 1
/^([^,]*,){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
Ответ 2
Если вы используете многообразие регулярных выражений, которое поддерживает квантификатор Possessive (например, Java), вы можете сделать:
^(?:[^,]*+,){21}[^,]*+$
Квантор Possessive может быть лучше, чем квантор жадности.
Объяснение:
(?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
Ответ 3
Быстрее и понятнее перебирать строку, подсчитывать количество найденных запятых, а затем сравнивать их с 21.
Ответ 4
Точно 21 запятая:
^([^,]*,){21}[^,]$
Не менее 21 запятая:
^([^,]?,){21}.*$
Ответ 5
^(?:[^,]*)(?:,[^,]*){21}$
Ответ 6
если ровно 21:
/^[^,]*(,[^,]*){21}$/
если не менее 21:
/(,[^,]*){21}/
Однако я бы предложил не использовать регулярное выражение для такой простой задачи. Потому что он медленный.
Ответ 7
Какой язык? Вероятно, есть более простой метод.
Например...
В CFML вы можете просто увидеть, есть ли ListLen(MyString)
22
В Java вы можете сравнить MyString.split(',')
с 22
и т.д...
Ответ 8
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);
Ответ 9
.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,