RegEx - проблема с многострочным вводом - PullRequest
4 голосов
/ 10 сентября 2010

У меня есть строка с многострочным контентом, и я хочу выбрать многострочный регион, желательно с использованием регулярного выражения (просто потому, что я сейчас пытаюсь понять Java RegEx).

Рассмотрим ввод, как:

Line 1
abc START def
Line 2
Line 3
gh END jklm
Line 4

Предполагая, что START и END являются уникальными и маркерами начала / конца для региона, я хотел бы создать шаблон / сопоставление, чтобы получить результат:

 def
Line 2
Line 3
gh 

Моя текущая попытка

Pattern p = Pattern.compile("START(.*)END");
Matcher m = p.matcher(input);
if (m.find())
  System.out.println(m.group(1));

Но результат

gh

Таким образом, m.start(), кажется, указывает на начало строки, которая содержит «маркер конца». Я пытался добавить Pattern.MULTILINE к вызову компиляции, но это (само по себе) ничего не изменило.

Где моя ошибка?

Ответы [ 3 ]

8 голосов
/ 10 сентября 2010

Вы хотите Pattern.DOTALL, поэтому . соответствует символам новой строки. MULTILINE решает другую проблему, якоря ^ и $.

Pattern p = Pattern.compile("START(.*)END", Pattern.DOTALL);
2 голосов
/ 10 сентября 2010

Вы хотите установить Pattern.DOTALL (чтобы вы могли сопоставить символы конца строки с вашим. Wildcard), см. Этот тест:

@Test
public void testMultilineRegex() throws Exception {
    final String input = "Line 1\nabc START def\nLine 2\nLine 3\ngh END jklm\nLine 4";
    final String expected = " def\nLine 2\nLine 3\ngh ";
    final Pattern p = Pattern.compile("START(.*)END", Pattern.DOTALL);
    final Matcher m = p.matcher(input);
    if (m.find()) {
        Assert.assertEquals(expected, m.group(1));
    } else {
        Assert.fail("pattern not found");
    }
}
1 голос
/ 10 сентября 2010

Регулярное выражение metachar . не соответствует символу новой строки.Вы можете попробовать регулярное выражение:

START([\w\W]*)END

, которое использует [\w\W] вместо ..

[\w\W] - это класс char, который соответствует word-char и non-word-char, поэтому эффективно соответствует всему.

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