String test = "# Command\n\nFirst line of interest\r\nSecond line of interest\n\r\nThird line of interest\r\n\n";
System.out.printf("%n>>%s<<%n", test);
Pattern p = Pattern.compile("^(?!#).+(?:[\r\n]+.+)*", Pattern.MULTILINE);
Matcher m = p.matcher(test);
if (m.find())
{
System.out.printf("%n>>%s<<%n", m.group());
}
вывод:
>># Command
First line of interest
Second line of interest
Third line of interest
<<
>>First line of interest
Second line of interest
Third line of interest<<
Матч начинается в начале (^
в режиме MULTILINE) первой строки, которая неначинаться с символа хеша ((?!#)
), но содержит символы, отличные от разделителей строк (.+
, не .*
).
[\r\n]+
соответствует одному или нескольким разделителям строк, будь то разделитель Unix (\n
), DOS (\r\n
) или более старый Mac (\r
).Вы всегда должны быть готовы обрабатывать любой или все различные разделители строк, независимо от того, на какой платформе работает ваш код.
(?:[\r\n]+.+)*
, затем сопоставляет ноль или более дополнительных строк, не сопоставляя ни одной конечной строкисепараторы.