正则表达式找到句子的结尾

时间:2011-03-10 14:24:56

标签: java regex

我正在制作一个正则表达式来查找文本中句子的结尾。 在这里,我假设任何句子都可以以。!? 有时虽然有人喜欢两个写!!!!!!在他们和他们的句子。 所以我想替换任何重复的点,感叹号或问号。 但我想允许使用'...'。我怎么能包含这个例外? 请指教,谢谢!

Pattern p = null;
    try {
    //([!?.] with optional spaces), followed by ([!?.] with optional spaces) repeated 1 or more times
        p = Pattern.compile("([!?.]\\s*)([!?.]\\s*)+");
    }
    catch (PatternSyntaxException pex) {
        pex.printStackTrace();
        System.exit(0);
    }

    //get the matcher
    Matcher m = p.matcher(this.sentence);
    int index = 0;
    while(m.find(index))
    {
        System.out.println(this.sentence);
        System.out.println(p.toString());
        String toReplace = sentence.substring(m.start(), m.end());
        toReplace = toReplace.replaceAll("\\.","\\\\.");
        toReplace =toReplace.replaceAll("\\?","\\\\?");
        String replacement = ""+sentence.charAt(m.start());
        this.sentence = this.sentence.replaceAll(toReplace, replacement);
        System.out.println("");
        index = m.end();
        System.out.println(this.sentence);
    }

4 个答案:

答案 0 :(得分:2)

免责声明:我的回答将不在议题上(不使用正则表达式)。

如果它不是太重量级,请尝试使用Apache OpenNLP。 NLP的意思是“自然语言处理”。查看detecting sentences上的文档。

代码的相关位是:

String sentences[] = sentenceDetector.sentDetect("  First sentence. Second sentence. ");

你将获得两个Strings的数组。第一个是“第一句”,第二个是“第二句”。

在使用上述代码行之前,还需要编写更多代码,但是你可以得到一般的想法。

答案 1 :(得分:0)

对此最简单的解决方案通常是首先将所有出现的字符串“...”替换为文本中没有的特殊字符,例如ascii控制字符。

在此替换之后,用单个部分替换句子结尾的所有多个实例。

然后用你的句末字符+你用来替换“...”的特殊字符找到句子的结尾(如果你想要“......”来表示一个句子的结尾)

最后再用“...”替换特殊字符。

我不是java程序员,所以我不能给你特定的java代码,但这类问题的最简单方法通常是多个split / join语句而不是替换。

如下所示:

str.split("...").join("<special char>")

答案 2 :(得分:0)

“...”案例最简单的正则表达式解决方案就是使用量化匹配:

someString.split("(\\.{1,2})|(\\.{4,})|(\\?+)|(!+)");

这当然无视已经提到的其他边缘情况。

答案 3 :(得分:0)

我正在做这样的事情。到目前为止,看起来我可以通过查找字符[。?!]然后a)一个或两个空格然后一个单词(不是单个字母)将我的段落(基于文本之间的空行分组)分成句子初始上限或b)没有,因为它是段落的结尾。在我的情况下,我没有任何嵌入的引用文本,但如果我找到一些,我想排除这种情况。我正在处理法律/财务文件,所以我不确定'NLP'会有所帮助;语言不自然。但我可以看看。创建合适的RegEx看起来很难,因此NLP方法可以节省时间。