Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式不匹配_Java_Regex - Fatal编程技术网

Java 正则表达式不匹配

Java 正则表达式不匹配,java,regex,Java,Regex,我有以下文字 CHAPTER 1 Introduction CHAPTER OVERVIEW 我为它创建并测试了()以下正则表达式 (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

我有以下文字

CHAPTER 1
Introduction
CHAPTER OVERVIEW 
我为它创建并测试了()以下正则表达式

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

您的文档也可能有DOS换行
\r
。您可以使用以下任一模式:

Pattern p = Pattern.compile("CHAPTER\\s+\\d+\\R");
\R
(需要Java 8)将在您的数字后匹配
\R
\n
的任意组合,或仅使用:

Pattern p = Pattern.compile("CHAPTER\\s+\\d+\\s");
因为
\s
还匹配任何空格,包括换行符

另一种选择是使用带有锚定的
多行
标志
$

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

您的问题在源文本中。我想你忘了新台词了。因为:

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(文档)
中真正得到的内容。 您可以使用模式作为编译的第二个参数。(Pattern.MULTILINE)更多信息


.

匹配换行符可能有问题,您是否可以尝试\r\n而不仅仅是\n?因为Java 8,匹配换行符的更好替代方法是。它将匹配
\r\n
(Windows)、一个
\r
(旧MacOSs)、一个
\n
(Linux)和其他一些具有相同含义的Unicode字符。非常感谢@Aaron,
\r
肯定更好(编辑),除非你想匹配空行,我想你可以去掉
+
量词,因为
\R
将匹配整个
\R\n
序列。非常感谢@anubhava为您提供的帮助,经过测试,工作完美。