Соответствующее регулярному выражению текст внутри строки с удаленными завершающими символами новой строки - PullRequest
2 голосов
/ 06 августа 2011

Здравствуйте, мне нужно найти регулярное выражение, которое получит среднюю часть этого текста:

# Command // first line with symbol character 

First line of interest
Second line of interest
\n
Third line of interest
\n
\n // I am not interested in trailing new lines.

Как получить текст, начинающийся с первой строки интереса и заканчивающийся третьей строкой интереса? Спасибо.

Ответы [ 3 ]

3 голосов
/ 07 августа 2011
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]+.+)*, затем сопоставляет ноль или более дополнительных строк, не сопоставляя ни одной конечной строкисепараторы.

3 голосов
/ 06 августа 2011

Приведенный вами пример очень прост, я надеюсь, что вы можете перенести это регулярное выражение в ваш вариант использования:

((?mi)First.*interest\b)

Объяснение:

(
(?mi)    // Use DOTALL and MULTILINE mode
First    // First word you are interested in
.*       // Any character...
interest // ..up to the last word you are interested in
\b       // Word boundary to stop there
)

Если (?mi)не работает, используйте флаги, как описано в java.util.regex.Pattern.

Чтобы поиграть с регулярным выражением, всегда хорошо иметь редактора, который показывает вам, что соответствует регулярному выражению, например: http://myregexp.com/signedJar.html

0 голосов
/ 06 августа 2011

Использование

Pattern.compile("(?<=# Command\\n\\n)[^\\n].*[^\\n](?=\\n*)", Pattern.DOTALL)

Я не был уверен, насколько буквальным был текст перед интересующими линиями, поэтому я жестко закодировал позитивный взгляд за спиной.Вы можете изменить его в соответствии со своими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...