拆分以“结束”结尾的段落&引用;Java中的点后新行

拆分以“结束”结尾的段落&引用;Java中的点后新行,java,netbeans,pdfbox,Java,Netbeans,Pdfbox,我试图从PDF文件中读取文本,并将每个段落拆分,然后将其放入ArrayList并打印ArrayList的元素,但我没有输出 String path = "E:\\test.pdf"; PDFTextStripper pdfStripper = null; PDDocument pdDoc = null; COSDocument cosDoc = null; File file = new File(path); PDFParser parser = new PDFParser(new File

我试图从PDF文件中读取文本,并将每个段落拆分,然后将其放入ArrayList并打印ArrayList的元素,但我没有输出

String path = "E:\\test.pdf";
PDFTextStripper pdfStripper = null;
PDDocument pdDoc = null;
COSDocument cosDoc = null;
File file = new File(path);

PDFParser parser = new PDFParser(new FileInputStream(file));
parser.parse();
cosDoc = parser.getDocument();
pdfStripper = new PDFTextStripper();
pdDoc = new PDDocument(cosDoc);

pdfStripper.setStartPage(1);
pdfStripper.setEndPage(1);

String page = pdfStripper.getText(pdDoc);
String[] paragraph = page.split("\n");
ArrayList<String> ramy = new ArrayList<>();
String p = "";
for (String x : paragraph) {

    if ((x.endsWith("\\.")) || (x.endsWith("\\." + "\\s+"))) {
        p += x;
        ramy.add(p);
        p = "";
    } else {
        p += x;
    }

}

for (String x : ramy) {
    System.out.print(x + "\n\n");
}
String path=“E:\\test.pdf”;
PDFTextStripper pdfStripper=null;
PDDocument pdDoc=null;
COSDocument cosDoc=null;
文件=新文件(路径);
PDFParser parser=newpdfparser(newfileinputstream(file));
parser.parse();
cosDoc=parser.getDocument();
pdfStripper=新的PDFTextStripper();
pdDoc=新的pdDoc文件(cosDoc);
pdfStripper.设置开始页(1);
pdfStripper.setEndPage(1);
String page=pdfStripper.getText(pdDoc);
字符串[]段落=页拆分(“\n”);
ArrayList ramy=新的ArrayList();
字符串p=“”;
用于(字符串x:段落){
if((x.endsWith(“\\”)| |(x.endsWith(“\\”+“\\s+”))){
p+=x;
加(p);
p=“”;
}否则{
p+=x;
}
}
用于(字符串x:ramy){
系统输出打印(x+“\n\n”);
}

注意:我正在使用NetBeans 8.0.2、windows 8.1和pdfbox库来读取pdf文件。

您遇到的最严重的错误是使用
“\\”调用
endsWith()
,这是两个字符;文字反斜杠和文字点(不是转义点),再加上
“\\.\\s+”
(同样是所有文字字符)。很明显,您(错误地)认为该方法接受regex,但它不接受

假设逻辑正确,将测试更改为使用基于正则表达式的测试:

 if (x.matches(".*\\.\\s*"))
此测试将代码的意图合并到一个测试中


请注意,您不需要使用
$
结束正则表达式,因为
匹配()
必须匹配整个字符串才能返回
true
,因此
^
$
都隐含在模式的开始/结束处。

您遇到的最严重错误是使用
“\\”调用
endsWith()
,这是两个字符;文字反斜杠和文字点(不是转义点),再加上
“\\.\\s+”
(同样是所有文字字符)。很明显,您(错误地)认为该方法接受regex,但它不接受

假设逻辑正确,将测试更改为使用基于正则表达式的测试:

 if (x.matches(".*\\.\\s*"))
此测试将代码的意图合并到一个测试中


请注意,您不需要以
$
结束正则表达式,因为
matches()
必须匹配整个字符串才能返回
true
,因此,
^
$
都隐含在模式的开始/结束处。

endsWith
不使用正则表达式,因此可能不需要
\\\.
\\\s
。顺便说一句,不要使用连接将新字符串添加到现有的
p+=x因为每次执行此代码时,都需要复制原始字符串和新字符串,以创建包含
original+new
部分的新字符串实例。而是使用
StringBuilder
及其
append
方法。完成后,只需在此生成器上使用
toString
。我可以使用breakiterator拆分段落吗?如果是的话,我怎么能做到呢?看起来我误解了你的问题。从“以点结尾”判断,我想你是在问句子,而不是段落。我会重新回答你的问题。抱歉混淆。顺便说一句,我不确定是否可以使用
BreakIterator.getLineInstance
查找段落,但您可以尝试使用它。
endsWith
不使用正则表达式,因此可能不需要
\\.
\\s
。顺便说一句,不要使用连接将新字符串添加到现有的
p+=x因为每次执行此代码时,都需要复制原始字符串和新字符串,以创建包含
original+new
部分的新字符串实例。而是使用
StringBuilder
及其
append
方法。完成后,只需在此生成器上使用
toString
。我可以使用breakiterator拆分段落吗?如果是的话,我怎么能做到呢?看起来我误解了你的问题。从“以点结尾”判断,我想你是在问句子,而不是段落。我会重新回答你的问题。抱歉混淆。顺便说一句,我不确定是否可以使用
BreakIterator.getLineInstance
查找段落,但您可以尝试使用它。
endsWith
不使用正则表达式,因此可能不需要
\\.
\\s
。顺便说一句,不要使用连接将新字符串添加到现有的
p+=x因为每次执行此代码时,都需要复制原始字符串和新字符串,以创建包含
original+new
部分的新字符串实例。而是使用
StringBuilder
及其
append
方法。完成后,只需在此生成器上使用
toString
。我可以使用breakiterator拆分段落吗?如果是的话,我怎么能做到呢?看起来我误解了你的问题。从“以点结尾”判断,我想你是在问句子,而不是段落。我会重新回答你的问题。抱歉造成混淆。顺便说一句,我不确定是否可以使用
BreakIterator.getLineInstance
查找段落,但您可以尝试一下。