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