2013-09-10 1 views
2

Моя входная строкагруппы захват разделенной точки с запятой строки отсутствует последнюю группу

String input=" 4313 :F:7222;scott miles:F:7639;Henry Gile:G:3721"; 

Это строка с точкой с запятой разделителем. Он может содержать любое количество значений, разделенных точкой с запятой

Я хочу использовать функцию захвата группы в Java и захватить следующие значения (т.е. с разделителями)

  4313 :F:7222 
     scott miles:F:7639 
     Henry Gile:G:3721 

Я знаю, что может использовать раздвоение функции в Spring класса но по какой-то причине я хочу использовать групповой захват здесь.

Я попытался

Matcher myMatcher = Pattern.compile("(.*?);").matcher(input); 
while (myMatcher.find()) { 
    System.out.println("group is " + myMatcher.group()); 
} 

выход

group is 4313 :F:7222; 
group is scott miles:F:7639; 

но ожидается выход

group is 4313 :F:7222 
group is scott miles:F:7639 
group is Henry Gile:G:3721 

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

+0

Попробуйте добавить '?' После ';'. Он должен захватить и последнюю группу. –

+0

@SilviuBurcea no no no, не добавляйте '?' После ';'. Вы получите полностью искаженные матчи! Если вы хотите знать, что я имею в виду, ознакомьтесь с этой демонстрацией regex: http://regex101.com/r/jV6fD4 – Jerry

ответ

5

Попробуйте использовать регулярное выражение:

([^;]+) 

Это должно получить все группы, которые требуют.

regex101 demo.

+0

Я получил объяснение по указанной вами ссылке. но я думаю ([^;] *) так же хорош, как ([^;] +) в моем случае правильно? – emilly

+0

@emilly Yup. Обычно я пытаюсь использовать то, что «безопаснее», потому что вы также получите пустые строки в своих результатах. – Jerry

+0

Я думаю, что вы имеете в виду + ​​будет искать одно или несколько случаев появления любого символа, кроме полуколонны, в то время как * будет искать 0 или более случаев (и поэтому * будет включать и пустые пробелы). Это верно? – emilly

1

Вы ищете группу, которая заканчивается полуколодой. Вот почему ваше регулярное выражение объединяет только две группы вместо трех. Вы можете использовать подход, который ищет группу, которая начинается с каждого символа, который не является символом полукольца.

([^;]+) 

или вы можете использовать semicolumn символ или символ конца строки при разборе строки ввода:

(.+?)(;|$) 

Оба эти подхода дают ожидаемый результат.

P.S. Для второго нужно получить 1-ю группу для ожидаемого результата:

System.out.println("group is " + myMatcher.group(1)); 
+0

Я думаю ([^;] *) так же хорош, как ([^;] +) в моем случае правильно? – emilly

+0

Фактически он соответствует каждой группе по одному, которая не должна содержать полуколону. Если найден полукольцо (это как разделитель в нашем случае), это означает, что мы получили новую группу, если после полуколонки есть хотя бы один символ. –

+0

Nope.if для использования ([^;] *) выход будет состоять из шести групп: группа 4313: F: 7222 группа группа - это scott мили: F: 7639 группа группа - Генри Джил: G: 3721 group is * является жадным оператором, он ищет полукольцо, и когда он находит, у нас есть новая пустая группа для полукольца - вот почему у нас есть 6 групп. –

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