2016-06-28 3 views
1

Я следующий текстRegEx Exepression не соответствует

CHAPTER 1 
Introduction 
CHAPTER OVERVIEW 

Что я сделал создать и тестирование (http://regexr.com/) следующие Regex для

(CHAPTER\s{1}\d\n) 

Однако, когда я использую следующий код на Java он терпит неудачу

String text = stripper.getText(document);//The text above 
Pattern p = Pattern.compile("(CHAPTER\\s{1}\\d\\n)"); 
Matcher m = p.matcher(text); 
    if (m.find()) { 
     //do action 
    } 

m.find() возвращает всегда false.

+0

Может возникнуть проблема с совпадением строки новой строки, вы можете попробовать \ r \ n вместо просто \ n? –

ответ

3

Ваш документ может иметь линию линии DOS \r. Вы можете использовать любой из этих моделей:

Pattern p = Pattern.compile("CHAPTER\\s+\\d+\\R"); 

\R (требуется Java 8) будет соответствовать любой комбинации \r и \n после ваших цифр или просто использовать:

Pattern p = Pattern.compile("CHAPTER\\s+\\d+\\s"); 

поскольку \s также соответствует любой пробел в том числе символы новой строки.

Другой альтернативой является использование MULTILINE флаг с якорем $:

Pattern p = Pattern.compile("(?m)CHAPTER\\s+\\d+$"); 
+3

С Java 8 лучшей альтернативой соответствию символам завершения строки является [метасимвол '\ R'] (https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern .html # lineending). Он будет соответствовать \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\ \\ \\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ – Aaron

+0

Большое спасибо @Aaron, '\ R' определенно лучше (отредактировано) – anubhava

+2

Если вы не хотите сопоставлять пустые строки, я думаю, вы можете отбросить квант' + ', так как' \ R' будет соответствовать целому '\ r \ n'. – Aaron

0

Ваша проблема в вашем тексте. Я думаю, вы забываете о новых строках. Потому что это:

String text = "CHAPTER 1\n" + 
       "Introduction\n" + 
       "CHAPTER OVERVIEW"; 
     Pattern p = Pattern.compile("(CHAPTER\\s{1}\\d\\n)"); 
     Matcher m = p.matcher(text); 
     System.out.println(m.find()); 

запишет истинную. Строковое тело копируется отсюда, а Intellij добавляет туда новые строки. Попробуйте отладить то, что вы действительно получаете в stripper.getText(document). Вы можете использовать Pattern в качестве второго параметра для компиляции. (Pattern.MULTILINE) Подробнее

here

.

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