2011-01-19 4 views
2

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

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

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

X 
XXX 
XAA 
AXXX 
AAAX etc 

, но не при вводе текста что-то вроде:

XAXAXA 

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

+2

Кроме того, необходимо каким-то образом обработки нечетных пробегов 'x', например, 'AXXXAAXXX'. Но, к слову, я не считаю, что эта задача возможна. –

+0

Yeah infact любое количество букв, дайвинг одного A из другого A. Это определенно возможно - я уверен, что видел его до – dr85

ответ

5

Следующее регулярное выражение соответствует строке, состоящей из нечетного числа 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

+1: Ницца! Я считаю, что это должно сработать (несмотря на мою хитроумную интуицию выше того, что это, вероятно, невозможно). –

+0

wow great - возможно ли это сделать наоборот? Как и в поиске A, (A [^ A] * A [^ A]) * – dr85

+0

@ dr85, конечно, 'X' или' A', это не имеет никакого значения для двигателя регулярных выражений. –

0

Non-Regex Пример

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

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

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

if (count % 2 != 0) 
    //Odd 
+0

Performance wouldn Не мешайте. Возьмите достаточно большую строку, и ваше предложение будет намного быстрее, чем использование регулярного выражения. Но я предполагаю, что dr85 просто интересовался, как это сделать в regex (я надеюсь, что он/она фактически не использует его в своем коде!) :) –

+0

никак, я всегда предпочитаю этот метод. Я изучаю регулярные выражения в минуту, и это единственная причина. – dr85

0

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

испытаны против

 
X - match 
XXX - match 
XAA - match 
AXXX - match 
AAAX - match 
XAXAXA - match 
XXAAAAAX - match 
AAXX - NO match 
AAXXXXXXAX - match 
+0

Это просто слегка сжатая версия выражения @Bart Kiers. –

+0

@Evan Mulawski, хорошо, разработал это самостоятельно, но взял меня на некоторое время, @Bart Kiers был быстрее – Valerij

+0

Возможно, я смотрел через ваше плечо! :) –

Смежные вопросы