RegEx Exepression不匹配

时间:2016-06-28 11:19:08

标签: java regex

我有以下文字

CHAPTER 1
Introduction
CHAPTER OVERVIEW 

我创建并测试了(http://regexr.com/)以下regEx for

(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。

2 个答案:

答案 0 :(得分: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+$");

答案 1 :(得分: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());

会写 true 。字符串正文从这里复制,Intellij添加新行。尝试调试stripper.getText(document)中的真实内容。 您可以使用Pattern作为第二个参数进行编译。 (Pattern.MULTILINE)更多信息

here