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