2013-04-14 4 views
2

Я пытаюсь использовать регулярное выражение, чтобы захватить 2 части одной полной строки. У меня есть регулярное выражение работает отлично на http://gskinner.com/RegExr/Группы регулярных выражений Java. * Vs normal regex

Вот пример строки:

Regex is fun when it works 99 

Вот мой Regex

(.*)\\s+(\\d+)$

Это группы, которые я получаю при использовании Искателя в Java (спички()) и рисунок:

1: Regex is fun when it works 99 
2: Regex is fun when it works 

Использование нормального регулярного выражения (на RegExr), я получаю результаты, которые я на самом деле ожидать:

1: Regex is fun when it works 
2: 99 

Есть ли какие-либо предостережений при тушении Regex в Java, что мне нужно, чтобы быть в курсе? У меня уже есть \\ для специальных символов. Может быть, есть трюк в использовании. ?

Если вы хотите, образец приложение для копирования и вставки:

String str = "Regex is fun when it works 33"; 
String regx = "(.*)\\s+(\\d+)$" 

Pattern p = Pattern.compile(regx); 
Matcher m = p.matcher(str); 

if (m.matches()) { 
    for (int i = 0; i < m.groupCount(); i++) { 
     System.out.println(i + ": " + m.group(i)); 
    } 
} 
+0

+1 для примера кода. – MikeM

ответ

3

Причина вы не получаете 99 вы ожидаете, что весь матч group(0) не учитывается в groupcount(), так что цикл for будет выручать слишком рано.

Поэтому, если вы измените i < m.groupCount() на i <= m.groupCount() вы получите

0: Regex это удовольствие, когда он работает 99
1: Regex это удовольствие, когда он работает
2: 99

+0

Hi Mike, Ах, он все время прятался. Я чувствую себя идиотом! Должно быть, ржавый. Благодарим за указание: – Jdcc

+0

+1 crikey! Я тоже это пропустил. Приятно подобрать. – Sepster

3

Измените свой первый захват, чтобы быть не жадным, следующим образом:

(.*?)\\s+(\\d+)$ 

Обратитесь к разделу «Берегитесь Greedyness» в this regex tutorial, но просто пронумерованный ? делает предшествующий * квантор ленивый. То есть, это прекратит употреблять персонажей как можно раньше.

+0

Hey Sepster, Спасибо за быстрый ответ и более эффективное Regex! Это ленивое Regex лучше подходит для того, что я хочу захватить. Также кажется, что у него будет более высокая производительность, но это всего лишь предположение :) Объединив это с ответом MikeM, я исправил проблему! Спасибо! – Jdcc