我试图将一个字符串拆分为“句子”,但我遇到了一个跟踪单词的问题。例如:正则表达式句子拆分
"This isn't cool. This doesn't work. This"
应该分成
[This is cool., This doesn't work., This]
到目前为止,我一直在使用"[^\\.!?]*[\\.\\s!?]+"
但无法弄清楚如何调整这个拖尾字,因为没有终止字符,因此没有什么可寻找的。有什么我可以添加或我需要完全调整它?
我试图将一个字符串拆分为“句子”,但我遇到了一个跟踪单词的问题。例如:正则表达式句子拆分
"This isn't cool. This doesn't work. This"
应该分成
[This is cool., This doesn't work., This]
到目前为止,我一直在使用"[^\\.!?]*[\\.\\s!?]+"
但无法弄清楚如何调整这个拖尾字,因为没有终止字符,因此没有什么可寻找的。有什么我可以添加或我需要完全调整它?
而是分裂字符串中,你可以找到所有的句子匹配尾随句话你可以使用锚$
将字符串的结尾匹配和:
List<String> sentences = new ArrayList<String>();
Matcher m = Pattern.compile("[^?!.]+(?:[.?!]|$)")
.matcher("This isn't cool. This doesn't work. This");
while (m.find()) {
sentences.add(m.group());
}
String s = "This isn't cool. This doesn't work. This";
System.out.println(Arrays.toString(s.split("\\. ")));
产地:
[This isn't cool, This doesn't work, This]
您也可以安全地将最后的+
更改为*
。
正则表达式默认为贪婪,每个单独的部分将抓取尽可能多的数据。这意味着第一个子表达式将匹配
This isn't cool
和下一部分的时期和空间 - 仅此而已。将加号改为星号不会改变此行为。在字符串内部,所有的句子结尾字符都会匹配,并且最后没有什么可以匹配 - 这与*
有效。
我在手机上,不能测试这个,但是你应该尝试添加字符串元字符'$'的结尾到你的第二系列字符。 – brittenb
我不会投票关闭它作为[将字符串拆分成基于句点的句子]的副本(http://stackoverflow.com/questions/2687012/split-string-into-sentences-based-on-periods),因为您的标题明确指出你想使用正则表达式,但考虑使用其他工具来描述所描述的问题。 – Pshemo