2016-12-20 6 views
4

Учитывая отрывок текста, какJava регулярное выражение для извлечения текстовых последовательностей по нескольким строкам

Preface (optional, up to multiple lines) 
Main : sequence1 
    sequence2 
    sequence3 
    sequence4 
Epilogue (optional, up to multiple lines) 

, который Java регулярное выражение может быть использовано для извлечения всех последовательностей (т.е. sequence1, sequence2, sequence3, sequence4 выше)? Например, цикл Matcher.find()?

Каждой «последовательности» предшествует и может также содержать 0 или более белых пробелов (включая вкладки).

следующее регулярное выражение

(?m).*Main(?:[ |t]+:(?:[ |t]+(\S+)[\r\n])+ 

дает только первую последовательность (sequence1).

+0

Означает ли это, что вам нужно получить несколько матчей непробельных куски, которые имеют некоторые горизонтальные пробельные на последующих строках после 'Main:'? –

+0

Используйте ['String p =" (? M) (?: \\ G (?! \\ A) [^ \\ S \ r \ n] + |^Main \\ s *: \\ s *) (\\ S +) \ r? \ N? ";'] (Https://regex101.com/r/P1od0v/1) –

+0

Одно совпадение в строке. Ваше регулярное выражение работает, спасибо и +1. – PNS

ответ

3

Вы можете использовать следующую regex:

(?m)(?:\G(?!\A)[^\S\r\n]+|^Main\s*:\s*)(\S+)\r?\n? 

Детали:

  • (?m) - многострочный режим на
  • (?:\G(?!\A)[^\S\r\n]+|^Main\s*:\s*) - одно из двух:
    • \G(?!\A)[^\S\r\n]+ - конец предыдущего успешного матча (\G(?!\A)), а затем 1+ горизонтальные пробелы ([^\S\r\n]+, может быть заменен [\p{Zs}\t]+ или [\s&&[^\r\n]]+)
    • | - или
    • ^Main\s*:\s* - начало строки, Main, 0+ пробельные, :, 0+ пробельные
  • (\S+) - Группа 1 Захват 1+ непробельных символы
  • \r?\n? - дополнительный CR и дополнительный НЧ.

Смотрите код Java ниже:

String p = "(?m)(?:\\G(?!\\A)[^\\S\r\n]+|^Main\\s*:\\s*)(\\S+)\r?\n?"; 
String s = "Preface (optional, up to multiple lines)...\nMain : sequence1\n sequence2\n sequence3\n sequence4\nEpilogue (optional, up to multiple lines)"; 
Matcher m = Pattern.compile(p).matcher(s); 
while(m.find()) { 
    System.out.println(m.group(1)); 
} 
+0

См. [Демонстрация Java] (http://www.tutorialspoint.com/compile_java8_online.php?PID=0Bw_CjBb95KQMcEVDU3VXUjk0QWM). –

+0

Это работает, спасибо. В идеале, я хотел бы что-то без якорей (\ G или \ A), но все же он выполняет эту работу. Возможно, существует более простая версия. :-) – PNS

+0

С 1 регулярным проходом это единственный способ. –