2014-11-04 3 views
3

Задача Regex: Я хочу получить группы дважды, но не знаю, как их решить.отделить два совпадения

Вот код:

public static void multiGroupTest() { 
    // Pattern p = Pattern.compile("(\\w+)(\\d\\d)(\\w+)"); 
    Pattern p = Pattern.compile("([A-Z]{1})(\\d+)([A-Za-z]+)"); 
    String str = "X89SuperJavaJavaX89SuperJava"; 
    Matcher m = p.matcher(str); 
    while (m.find()) { 
     System.out.println(m.group(1)); 
     System.out.println(m.group(2)); 
     System.out.println(m.group(3)); 
    } 
} 

ОК, результат:

X 
89 
SuperJavaJavaX 

Что я хочу получить это:

X 
89 
SuperJavaJava 
X 
89 
SuperJava 

Как я могу отделить два матча?

ответ

1

Поскольку последняя группа ([A-Za-z]+) с жадностью соответствует следующему X, вы не смогли получить две строки. Используйте ((?:[A-Z][a-z]+)+), чтобы записать слова, которые в этом FooBar формате. Потому что имена не заканчиваются заглавной буквой.

([A-Z])(\\d+)((?:[A-Z][a-z]+)+) 

DEMO

Pattern p = Pattern.compile("([A-Z])(\\d+)((?:[A-Z][a-z]+)+)"); 
String str = "X89SuperJavaJavaX89SuperJava"; 
Matcher m = p.matcher(str); 
while (m.find()) { 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
    System.out.println(m.group(3)); 
} 

Выход:

X 
89 
SuperJavaJava 
X 
89 
SuperJava 
+0

Он работает и решить проблему, которую я не понимаю – Levi

3

Изменить Pattern добавить отрицательный предпросмотр для цифры:

Pattern p = Pattern.compile("([A-Z]{1})(\\d+)([A-Za-z]+)(?!\\d)"); 
String str = "X89SuperJavaJavaX89SuperJava"; 

Выход

X 
89 
SuperJavaJava 
X 
89 
SuperJava 
+0

это круто и works.TKS Мена – Levi

+0

@Levi вы Добро пожаловать! – Mena

0
([A-Z]{1})(\d+)((?:(?!\1)[a-zA-Z])+) 

Попробуйте this.See демо.

http://regex101.com/r/sU3fA2/59

+0

Может ли downtvoter хотя бы дать некоторую информацию ???????? – vks

+0

это работы.TKS vks – Levi

+0

@vks Это второй раз, когда я вижу один из ваших рабочих ответов, проголосовавших без объяснений, +1, чтобы компенсировать несправедливое голосование –

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