2015-02-12 3 views
0

Я пытаюсь извлечь некоторую информацию из строки, как указано ниже:Извлечение нескольких групп из строки?

[В последнее время многие, браны, инфляции, сценарии были предложены, -LRB-, см., Например, ,, - LSB-, 3, -RSB-, for, a, review, -RRB-, вместе, с их вложениями в, -LRB-, извращенные, -RRB-, компактифицированные, суперструны, модели, , in, a, good, package, with, the phenology, constraints, coming, from, particle, Physics, -LRB-, см., например, ,, -LSB-, 4, -RSB-, -RRB- ,.]

Так что мне нужно, чтобы извлечь это значения, возникающие между площадью брекет (например -LSB-, 3, -RSB-, & & -LSB-, 4, -RSB-,)

Вот соответствующий отрывок из моего кода:

String pttrn = ".*-LSB-,\\s(\\d),\\s-RSB-,.*"; 
Pattern pattern = Pattern.compile(pttrn); 
m = pattern.matcher(sentence.toString()); rgx = m.find(); 
int count = 0; 
while (rgx) { 
    String ref = (m.group(1));    
    count++; 
    System.out.println("found: " + count + " : " + m.start() + " - " + m.end()); 
    statement.clearParameters(); 
    statement.setString(1, rs.getString("ut")); 
    statement.setString(2, rs.getString("sec_title")); 
    statement.setString(3, ref); 
    statement.executeUpdate(); 

    } 

В результате этого кода, я всегда получаю одно значение. Когда я пытаюсь m.group (2), я получаю сообщение о том, что нет группы 2 .. Что я могу пропустить?

ответ

2

У вас есть только одна группы в вашем шаблоне, так что один матч будет предоставить только одну группу. Вам нужно применить поиск несколько раз:

while (m.find()) { 
    System.out.println(m.group(1)); 
} 

Это означает, что ваш код должен быть:

String input = "..."; 
Matcher matcher = Pattern.compile("-LSB-,\\s(\\d),\\s-RSB-,").matcher(input); 

while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
    // the real work should go here 
} 

Для меня это печатает:

3 
4 
+0

Спасибо за ваш быстрый ответ. Но теперь, когда я использую m.find, он снова возвращает только одно значение. Я немного смущен. Мой шаблон улавливает две одинаковые группы и, применяя while (m.find()), я ожидаю получить их через цикл. ИЛИ я должен написать тот же шаблон снова. Если это так, я должен знать, сколько групп существует в предложении, прежде чем применять регулярное выражение? Извините за мое плохое объяснение :( –

+0

В принципе, один вызов 'm.find()' будет находить регулярное выражение один раз, после чего будет заполнять 'm.group (1)'. Когда вы * вызываете find again * m.group (1) 'будет заполнена следующим совпадением_. Вызов' m.find() 'возвращает логическое значение, указывающее, была ли найдена находка успешной, поэтому ставить ее в цикл while будет искать каждое совпадение. нужно знать, сколько совпадений существует. –

+0

В основном вы должны заменить 'while (rgx)' на 'while (m.find())' и удалить вызов 'm.find()', который находится за пределами цикла while. –

1

Вы должны вызвать найти в цикле в то время как:

while (m.find()) { 
Смежные вопросы