当您已经拥有 String.split() 方法时,您不需要引入特殊的解析器来执行此操作。您只需要使用正确的Regular Expression (RegEx) 来执行任务。
段落中的句子可能不仅仅在其末尾包含句点。句末可能有问号 (?) 或感叹号 (!)。要真正从段落中提取所有句子,您需要考虑这一点。另一件要考虑的事情,如果有一个数值恰好到达句子中的特定小数点,例如:
“嘿,伙计们,听听这个。这件物品的价值是 123.45 美元,你猜怎么着,她付了所有的钱
一口气!那个 www.ebay.com 是一个买东西的好地方
你不觉得吗?我想我会坚持使用 www.amazon.com。我是
没有上瘾,但他们多年来一直对我很好。”
现在看上面的小段落,您可以清楚地看到其中的一些内容,在将其拆分为单个句子时显然需要考虑这些内容。我们不能只从句号 (.) 开始。我们
并不是真的要拆分货币价值和网络域,而且,我们不会将什么问题或感叹句包含在其他句子中。
要使用 String.split() 方法将这个示例段落分解成单独的句子而不破坏内容,我们可以使用这个正则表达式:
String[] sentences = paragraph.trim().split("(?<=\\.\\s)|(?<=[?!]\\s)");
您是否注意到我们在这里也使用了 String.trim() 方法?有些段落可以以制表符或空格开头,因此我们只需在执行拆分之前立即删除这些段落(以防万一)。 String.split() 方法中使用的Regular Expression(利用Positive Look-Behind)实际上并没有那么复杂,您可以使用test it here。以下是它的内容:
如果您现在像这样遍历名为 sentences 的字符串数组变量:
for (String sentence : sentences) {
System.out.println(sentence + " \n");
}
您的控制台输出应类似于:
Hey folks, listen to this.
The value of the item was $123.45 and guess what, she paid all in one shot!
That www.ebay.com is a real great place to get stuff don't you think?
I think I'll stick with www.amazon.com though.
I'm not hooked on it but they've treated me great for years.