Регулярное выражение для подсчета количества запятых в строке - PullRequest
32 голосов
/ 14 мая 2009

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

Ответы [ 9 ]

88 голосов
/ 14 мая 2009
/^([^,]*,){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
11 голосов
/ 14 мая 2009

Если вы используете разновидность регулярных выражений, которая поддерживает квантификатор 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
7 голосов
/ 14 мая 2009

Может быть быстрее и понятнее перебирать строку, подсчитывать количество найденных запятых и затем сравнивать их с 21.

6 голосов
/ 14 мая 2009

Ровно 21 запятая:

^([^,]*,){21}[^,]$

Минимум 21 запятая:

^([^,]?,){21}.*$
1 голос
/ 14 мая 2009

если точно 21:

/^[^,]*(,[^,]*){21}$/

если хотя бы 21:

/(,[^,]*){21}/

Однако я бы предложил не использовать регулярные выражения для такой простой задачи. Потому что это медленно.

1 голос
/ 14 мая 2009
^(?:[^,]*)(?:,[^,]*){21}$
0 голосов
/ 14 мая 2009
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);
0 голосов
/ 14 мая 2009

На каком языке? Вероятно, есть более простой способ.

Например ...

В CFML вы можете просто увидеть, является ли ListLen(MyString) 22 * ​​1006 *

В Java вы можете сравнить MyString.split(',') с 22 * ​​1009 *

и т.д ...

0 голосов
/ 14 мая 2009
.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...