Подсчет букв в строковом регулярном выражении - PullRequest
2 голосов
/ 19 января 2011

У меня есть регулярное выражение, которое наполовину работает для подсчета всех строк, которые имеют нечетные числа X.

^[^X]*X(X{2}|[^X])*$

Это работает почти во всех случаях:

X
XXX
XAA
AXXX
AAAX etc

но не удается набрать что-то вроде:

XAXAXA

Мне нужно дополнительное предложение, которое учитывает строки с чередующимися X, то есть XAXA. Смежные X-шаблоны уже отображаются X {2} *.

Ответы [ 3 ]

5 голосов
/ 20 января 2011

Следующее регулярное выражение соответствует строке, состоящей из неравного числа X:

^[^X]*(X[^X]*X[^X]*)*X[^X]*$

Быстрый разбив:

^          # the start of the input
[^X]*      # zero or more chars other than 'X'
(          # start group 1
  X[^X]*   #   an 'X' followed by zero or more chars other than 'X'
  X[^X]*   #   an 'X' followed by zero or more chars other than 'X'
)          # end  group 1
*          # repeat group 1 zero or more times
X          # an 'X'
[^X]*      # zero or more chars other than 'X'
$          # the end of the input

Итак, повторяемая группа 1приводит к совпадению нуля или четного числа X для сопоставления, а одиночный X после равен делает его неравномерным.

0 голосов
/ 20 января 2011

попробуй это, у меня нормально работает ^[^X]*((X[^X]*){2})*X[^X]*$

проверено против

X - match
XXX - match
XAA - match
AXXX - match
AAAX - match
XAXAXA - match
XXAAAAAX - match
AAXX - <strong>NO match</strong>
AAXXXXXXAX - match
0 голосов
/ 20 января 2011

Пример без регулярных выражений

Это может мешать работе, но я не уверен, что вы беспокоитесь об этом.

String str = "AXXXAXAXXX";
char[] cArray = str.toCharArray();
int count = 0;

for (char c : cArray)
{
    if (c == 'X')
        count++;
}

if (count % 2 != 0)
    //Odd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...