Подтвердить что ты не робот

Регулярное выражение для подсчета числа запятых в строке

Как создать регулярное выражение, которое будет соответствовать строке любой длины, содержащей любые символы, но должно содержать 21 запятую?

4b9b3361

Ответ 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

.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,