2013-10-08 4 views
4

Я следующее содержимое файла, и я стараюсь, чтобы соответствовать рег пояснено ниже:Matching регулярное выражение многострочный не работает

-- file.txt (doesn't match multi-line) -- 
test 

On blah 

more blah wrote: 
--------------- 

Если я прочитал содержимое файла сверху строку и попытаться соответствовать «On ... пишет:» часть я не могу получить матч:

// String text = <file contents from above> 
    Pattern PATTERN = Pattern.compile("^(On\\s(.+)wrote:)$", Pattern.MULTILINE); 
    Matcher m = PATTERN.matcher(text); 
    if (m.find()) { 
     System.out.println("Never gets HERE???"); 
    } 

выше регулярное выражение прекрасно работает, если содержимое файла находятся на одной линии:

-- file2.txt (matches on single line) -- 
test 

On blah more blah wrote: On blah more blah wrote: 
--------------- 

Как получить многострочную работу и одну строку в одном регулярном выражении (или два, если на то пошло)? Спасибо!

ответ

3

Pattern.MULTILINE просто говорит Java принимать якоря ^ и $ для соответствия в начале и конце каждой строки.

Добавить флаг Pattern.DOTALL, чтобы символ точки . соответствовал символам новой строки. Это делается с помощью bitwise inclusive OR| оператора

Pattern PATTERN = 
    Pattern.compile("^(On\\s(.+)wrote:)$", Pattern.MULTILINE | Pattern.DOTALL); 
+0

Фантастический! Работал в первый раз, как рекламируется! Спасибо! – JaJ

+0

Без проблем рад помочь! :) – Reimeus

1

Вы можете использовать комбинацию соответствия \S (непробельный) и \s (пробельные)

Pattern PATTERN = Pattern.compile("(On\\s([\\S\\s]*?)wrote:)"); 

См live regex101 demo

Пример:

import java.util.regex.*; 

class rTest { 
    public static void main (String[] args) { 
    String s = "test\n\n" 
      + "On blah\n\n" 
      + "more blah wrote:\n"; 
    Pattern p = Pattern.compile("(On\\s([\\S\\s]*?)wrote:)"); 
    Matcher m = p.matcher(s); 
    if (m.find()) { 
     System.out.println(m.group(2)); 
    } 
    } 
} 
Смежные вопросы