Шаблон/сопоставитель в Java?

У меня есть определенный текст на Java, и я хочу использовать шаблон и сопоставитель, чтобы что-то извлечь из него. Это моя программа:

public String getItemsByType(String text, String start, String end) {

    String patternHolder;
    StringBuffer itemLines = new StringBuffer();

    patternHolder = start + ".*" + end;

    Pattern pattern = Pattern.compile(patternHolder);
    Matcher matcher = pattern.matcher(text);

    while (matcher.find()) {
        itemLines.append(text.substring(matcher.start(), matcher.end())
                + "\n");
    }

    return itemLines.toString();
}

Этот код полностью работает, КОГДА искомый текст находится в одной строке, например:

String text = "My name is John and I am 18 years Old"; 

getItemsByType(text, "My", "John");

сразу выхватывает текст «Меня зовут Джон» из текста. Однако, когда мой текст выглядит так:

String text = "My name\nis John\nand I'm\n18 years\nold"; 

getItemsByType(text, "My", "John"); 

Он ничего не захватывает, так как «Мой» и «Джон» находятся на разных линиях. Как мне это решить?


person ZimZim    schedule 30.03.2012    source источник
comment
Вы должны изменить `itemLines.append(text.substring(matcher.start(), matcher.end()) + \n);` на itemLines.append(matcher.group()); itemLines.append('\n');. Вы не должны выполнять конкатенацию строк, используя +, когда у вас есть строковый буфер. Также я бы использовал StringBuilder вместо StringBuffer.   -  person RokL    schedule 30.03.2012


Ответы (2)


Используйте это вместо этого:

Pattern.compile(patternHolder, Pattern.DOTALL);

Из javadoc Флаг DOTALL означает:

Включает точечный режим.

В точечном режиме выражение . соответствует любому символу, включая признак конца строки. По умолчанию это выражение не соответствует разделителям строк.

person Bohemian♦    schedule 30.03.2012
comment
Спасибо, сэр, это было невероятно полезно! - person ZimZim; 30.03.2012

Используйте Pattern.compile(patternHolder, Pattern.DOTALL) для компиляции шаблона. Таким образом, точка будет соответствовать новой строке. По умолчанию новая строка обрабатывается особым образом и не сопоставляется с точкой.

person Michał Kosmulski    schedule 30.03.2012