2012-03-30 2 views
3

У меня есть определенный текст на Java, и я хочу использовать шаблон и matcher, чтобы извлечь что-то из него. Это моя программа:Шаблон/Matcher в 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"); 

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

+0

Вы должны изменить 'itemLines.append (text.substring (matcher.start(), matcher.end()) + "\ п");' 'к itemLines.append (matcher.group()) ; itemLines.append ('\ n'); ' Вы не должны выполнять конкатенации строк, используя +, когда у вас есть строковый буфер под рукой. Также я бы использовал StringBuilder вместо StringBuffer. –

ответ

7

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

Pattern.compile(patternHolder, Pattern.DOTALL); 

С javadoc, то DOTALL флаг означает:

Позволяет dotall режим.

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

+0

Спасибо, сэр, это было невероятно полезно! – ZimZim

1

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

Смежные вопросы