2013-05-12 2 views
3

Результаты RegEx исключают результаты другого RegEx. Например, если я использую шаблонКак я могу получить действительно все соответствия RegEx?

[a-z&&[^aeiou]]{2} 

И я стараюсь соответствовать BCD, спички будет {Ьс} вместо {BC, CD}.

Я делаю это на Java.

+2

Примечание: В настоящее время нет метода (AFAIK), чтобы получить все совпадения, которые могут начинаться с того же индекса. например 'a *' для 'aaa', который может иметь 4 совпадения в индексе 0. Ответ Марко Топольника охватывает случай, когда вы хотите получить не более 1 совпадения по каждому индексу. – nhahtdh

ответ

2

Вы можете получить это с помощью опережающего просмотра, который включает захват группу:

(?=([a-z&&[^aeiou]]{2})). 

Вам нужен цикл с участием Matcher.find и запросы сличителя каждый раз с group(1), чтобы получить матч. Основное совпадение регулярных выражений не имеет значения и должно игнорироваться.

+0

Зачем вам нужен взгляд? И не заканчивается ли '.' в конце совпадение, состоящее только из последнего символа? – escitalopram

+0

'И не делает. в конце предотвратить совпадения, состоящие только из последнего символа? 'Нет, это не так. Но это предотвращает пустое совпадение (ну, если мы используем шаблон, который может соответствовать пустой строке). Взгляд-вперед - это один чистый способ приблизиться к этому, и вам не нужно заботиться о пограничных случаях. – nhahtdh

+0

@escitalopram I haven 'попробовал это, поэтому я положил '.' там консервативно. Я думаю, что все это работает без точки так же хорошо. –

2

Неоднократно используйте Matcher.find(int start) и Matcher.start(), чтобы узнать, на каком индексе String смотреть дальше.

String haystack="bcd"; 
Matcher m = pattern.matcher(haystack); 
int lookIndex=0; 
while(lookIndex < haystack.length() && m.find(lookIndex)) { 
    lookIndex=m.start()+1; 
    System.out.println("Found " + m.group()); 
} 
+0

Это действительно одно решение, но вам нужно быть осторожным, когда шаблон может соответствовать пустой строке ... – nhahtdh

+0

Теперь он настроен таким образом, чтобы исключить OutOfBoundsException. Также успешно протестировали его с шаблоном, сопоставляющим пустую строку. – escitalopram

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