Регулярное выражение работает над новыми строками Java - PullRequest
2 голосов
/ 31 марта 2011

У меня есть вывод, который выглядит следующим образом:

текст бла-бла-мусора
больше текста мусора, который не имеет значения
Продолжительность: 00: 02: 55.34, начало: 0,000000, битрейт: 4097 кб / с
еще немного мусорного текста
еще больше мусорного текста

В java я использую регулярное выражение, чтобы превратить эту строку в обычный старый
00: 02: 55.34
но он не заменяет строки сверху и снизу.Использование этой строки кода:

String durationString = s.replaceAll(".*Duration: (\\d\\d:\\d\\d:\\d\\d(\\.\\d\\d?)?).*", "$1");  

приводит к следующему:

текст бла-бла-мусора
больше текста мусора, который не имеет значения
00: 02: 55.34
еще немного мусорного текста
еще больше мусорного текста

Видимо,. * не захватывает новые строки, поскольку заменяет только текст в той же строке.

  1. Как я могу сделать захват. * Символом новой строки?
  2. Если 1. невозможно, есть ли способ сделать то, что мне нужно, если я не знаю, сколько строк текста мусорасверху и снизу?

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Вам необходимо установить флаг dot-all:

String durationString = s.replaceAll("(?s).*Duration: (\\d\\d:\\d\\d:\\d\\d(\\.\\d\\d?)?).*", "$1");  
0 голосов
/ 31 марта 2011

Вам нужно использовать флаг Pattern.DOTALL, чтобы сказать, что . должно соответствовать символам новой строки. или укажите флаг в шаблоне, используя (? s), например

String regex = "(?s).*Duration: (\\d\\d:\\d\\d:\\d\\d(\\.\\d\\d?)?).*";
0 голосов
/ 31 марта 2011

Попробуйте это:

String durationString = s.replaceAll(".*Duration: (\\d\\d:\\d\\d:\\d\\d(\\.\\d\\d?)?).*|.*", "$1");
...