拆分以“结束”结尾的段落&引用;Java中的点后新行
我试图从PDF文件中读取文本,并将每个段落拆分,然后将其放入ArrayList并打印ArrayList的元素,但我没有输出拆分以“结束”结尾的段落&引用;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
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
查找段落,但您可以尝试一下。