如何在java中使用正则表达式获取完整句子
现在,我正在使用稍后解析PDF,我将解析其他文档.docx/.doc。使用PDFBox,我将所有文件内容放在一个字符串中。现在,我想在用户定义的单词匹配的地方获得完整的句子 例如:如何在java中使用正则表达式获取完整句子,java,regex,Java,Regex,现在,我正在使用稍后解析PDF,我将解析其他文档.docx/.doc。使用PDFBox,我将所有文件内容放在一个字符串中。现在,我想在用户定义的单词匹配的地方获得完整的句子 例如: ... some text here.. Raman took more than 12 year to complete his schooling and now he is pursuing higher study. Relational Database. ... some text here .. 如
... some text here..
Raman took more than 12 year to complete his schooling and now he
is pursuing higher study.
Relational Database.
... some text here ..
如果用户给出输入年份,那么它应该返回整个句子
预期产出:
我正在尝试下面的代码,但它没有显示任何内容。有人能纠正这一点吗
Pattern pattern = Pattern.compile("[\\w|\\W]*+[YEAR]+[\\w]*+.");
另外,如果我必须包含多个单词来匹配as或condition,那么我应该在正则表达式中做什么更改
请注意,所有单词都是大写。不要试图将所有内容都放在单个regexp中。有一个标准的Java类可用于查找句子边界
public static String getSentence(String input, String word) {
Matcher matcher = Pattern.compile(word, Pattern.LITERAL | Pattern.CASE_INSENSITIVE)
.matcher(input);
if(matcher.find()) {
BreakIterator br = BreakIterator.getSentenceInstance(Locale.ENGLISH);
br.setText(input);
int start = br.preceding(matcher.start());
int end = br.following(matcher.end());
return input.substring(start, end);
}
return null;
}
用法:
public static void main(String[] args) {
String input = "... some text...\n Raman took more than 12 year to complete his schooling and now he\nis pursuing higher study. Relational Database. \n... some text...";
System.out.println(getSentence(input, "YEAR"));
}
对@Tagir Valeev answer的一个小补丁,用于防止索引越界异常
private String getSentence(String input, String word) {
Matcher matcher = Pattern.compile(word , Pattern.LITERAL | Pattern.CASE_INSENSITIVE)
.matcher(input);
if(matcher.find()) {
BreakIterator br = BreakIterator.getSentenceInstance(Locale.ENGLISH);
br.setText(input);
int start = br.preceding(matcher.start());
int end = br.following(matcher.end());
if(start == BreakIterator.DONE) {
start = 0;
}
if(end == BreakIterator.DONE) {
end = input.length();
}
return input.substring(start, end);
}
return null;
}
构成句子的规则是什么?请注意。在英语中有特殊的意义regex@anubhava在运行时由用户提供的特定单词匹配的地方。在上述情况下,这是一年,我已经提到。所以,它应该在找到年份词的地方返回整个句子。所以,它应该在找到年份词的地方返回整个句子。定义整个句子的规则是什么。以点结尾的文本不能是句子,因为句子也可以有Mr.或Sr.或Jr.等。好的,那么建议我,我应该使用什么?我们一听到这个词就可以查一下吗?我的意思是字符串/行的长度超过5或更多?我有一个问题,如果直接句符合标准,它仍然有效吗?我试过了,但没有成功。知道了。你有返回声明。让我检查一下我自己,我会更新你的。一个问题,如何传递多个单词来匹配?今年天气好吗。如果我在寻找找到%或YEAR的句子?@jWeaver,如果你想要这些单词中的任何一个,你可以调用getSentenceinput,YEAR,然后调用getSentenceinput,%。正确。但是,我正在确认我们是否会选择。谢谢
Pattern re = Pattern.compile("[^.!?\\s][^.!?]*(?:[.!?](?!['\"]?\\s|$) [^.!?]*)*[.!?]?['\"]?(?=\\s|$)", Pattern.MULTILINE | Pattern.COMMENTS);
Matcher reMatcher = re.matcher(result);
while (reMatcher.find()) {
System.out.println(reMatcher.group());
}
private String getSentence(String input, String word) {
Matcher matcher = Pattern.compile(word , Pattern.LITERAL | Pattern.CASE_INSENSITIVE)
.matcher(input);
if(matcher.find()) {
BreakIterator br = BreakIterator.getSentenceInstance(Locale.ENGLISH);
br.setText(input);
int start = br.preceding(matcher.start());
int end = br.following(matcher.end());
if(start == BreakIterator.DONE) {
start = 0;
}
if(end == BreakIterator.DONE) {
end = input.length();
}
return input.substring(start, end);
}
return null;
}