Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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,现在,我正在使用稍后解析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 .. 如

现在,我正在使用稍后解析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 ..
如果用户给出输入年份,那么它应该返回整个句子

预期产出:

我正在尝试下面的代码,但它没有显示任何内容。有人能纠正这一点吗

 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;
    }