2009-08-03 6 views
15

Я эту строкуJava - Извлечение строк с Regex

String myString ="A~BC~FGH~~zuzy|XX~ 1234~ ~~ABC~01/01/2010 06:30~BCD~01/01/2011 07:45"; 

и мне нужно, чтобы извлечь эти 3 подстрок

06:30
07:45

Если я использую это регулярное выражение \\ d {2} \: \\ d {2}, я могу извлечь только первый час 06:30

Pattern depArrHours = Pattern.compile("\\d{2}\\:\\d{2}"); 
Matcher matcher = depArrHours.matcher(myString); 
String firstHour = matcher.group(0); 
String secondHour = matcher.group(1); (IndexOutOfBoundException no Group 1) 

matcher.group (1) исключает исключение.
Также я не знаю, как извлечь 1234. Эта строка может измениться, но она всегда появляется после 'XX ~'
Есть ли у вас какая-либо идея о том, как сопоставить эти строки с выражениями регулярных выражений?

UPDATE

Благодаря Адам предложение Я теперь это регулярное выражение, которое соответствует моей струне

Pattern p = Pattern.compile(".*XX~ (\\d{3,4}).*(\\d{1,2}:\\d{2}).*(\\d{1,2}:\\d{2})"; 

I совпадает с номером, и 2 часа с matcher.group (1); matcher.group (2); matcher.group (3);

+0

Можете ли вы показать свой код? Это должно совпадать с 06:30, если все остальное в порядке. –

ответ

36

Функция matcher.group() ожидает принятия целочисленного аргумента: индекс группы захвата, начиная с 1. Индекс 0 является специальным, что означает «все совпадение». Группа захвата создается с использованием пары скобок «(...)». Все, что находится в скобках, захватывает. Группы нумеруются слева направо (опять же, начиная с 1), открывая скобки (что означает, что группы могут перекрываться). Поскольку в вашем регулярном выражении нет скобок, не может быть группы 1.

В javadoc класса Pattern распространяется синтаксис регулярных выражений.

Если вы ищете шаблон, который может повторяться некоторое количество раз, вы можете повторно использовать Matcher.find(), пока он не вернет false. Matcher.group(0) один раз на каждой итерации будет возвращать то, что соответствовало этому времени.

Если вы хотите создать одно большое регулярное выражение, которое соответствует всем всем сразу (которое, как я считаю, вам нужно), то вокруг каждого из трех наборов вещей, которые вы хотите захватить, поместите набор захватывающих круглых скобок, используйте Matcher.match(), а затем Matcher.group(n), где n равно 1, 2 и 3 соответственно. Конечно, Matcher.match() также может возвращать false, и в этом случае шаблон не соответствует, и вы не можете получить какую-либо из групп.

В вашем примере, что вы, вероятно, захотите сделать, это соответствовать предыдущему тексту, затем начать группу захвата, сопоставить цифры, завершить группу захвата и т. Д. ... Я не знаю достаточно о вашем точном формат ввода, но вот пример.

Позволяет сказать, что я имел строки вида:

Eat 12 carrots at 12:30 
Take 3 pills at 01:15 

И я хотел, чтобы извлечь количество и время.Мое регулярное выражение будет выглядеть примерно так:

"\w+ (\d+) [\w ]+ (\d{1,2}:\d{2})" 

Код будет выглядеть примерно так:

Pattern p = Pattern.compile("\\w+ (\\d+) [\\w ]+ (\\d{2}:\\d{2})"); 
Matcher m = p.matcher(oneline); 
if(m.matches()) { 
    System.out.println("The quantity is " + m.group(1)); 
    System.out.println("The time is " + m.group(2)); 
} 

Регулярное выражение означает «строку, содержащую слово, пробел, один или более цифр (которые захвачен в группе 1), пробел, набор слов и пробелов, заканчивающихся пробелом, за которым следует время (зафиксированное в группе 2, а время предполагает, что час всегда 0-дополняется до 2-х цифр). более близкий пример того, что вы ищете, но описание возможного ввода немного расплывчато.

+1

Спасибо, Адам, я был очень смущен API-интерфейсом – mickthompson

+1

Привет, Адам, формат моего ввода всегда один и тот же. Мне нужно извлечь 2 часа и число после строки XX ~ (1234 в примере примера). Это число может быть из {3,4} цифр. – mickthompson

+4

Надеюсь, это поможет другим. Вам ** необходимо ** вызывать 'm.matches()' (или 'm.find()') перед вызовом m.group(), иначе он скажет, что нет совпадений (потому что это не искать все еще), по крайней мере, это то, что происходит на Android. –

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