通过常见的标点符号将字符串拆分为句子

时间:2013-03-09 21:13:41

标签: php regex

我目前遇到的问题是我认为这是一项简单的任务。

如果我有一个字符串:

句子1“双引词”句子1.句子2?句子3(括号中的数字如1.2不应该分开)。句子4'单引号。其余的引用'句子4.句子5!

我想把它分成:

句子1“双引词”句子1。

句子2?

句子3(括号中的数字如1.2不应该分开)。

句子4'单引词。引用的其余部分'句子4。

句子5!

显然,简单的"\.|\?|!"匹配不起作用。任何帮助表示赞赏。

我意识到正则表达式可能不是最好的工具,但除非有其他快速简单的解决方案,我缺席了,我已经过了不归路。

2 个答案:

答案 0 :(得分:1)

尝试以下正则表达式

(?:^|\s).+?[.!?](?:\s|$)

答案 1 :(得分:1)

我不确定它是否适用于正则表达式。

但看看这个正则表达式(使用sed):

 sed -r 's/([.?!]) +([A-Z])|\1$/\1\n\2/g' file

输出:

Sentence 1 “double quoted phrase” sentence 1.
Sentence 2?
Sentence 3 (numbers in parentheses like 1.2 should not be split).
Sentence 4 ' single quoted phrase. rest of quote' sentence 4.
Sentence 5!

但它并不完美。如果您将句子4中的rest更改为Rest则会失败。

问题是,你必须检查,.!?包裹的"",'',(),[],{}....是不是句子的结尾。然而,更糟糕的是,例如,我会写一个句子:

The dot ". is a period.

注意我忘了(错误)收尾报价。或以下(两句话):

Why not put a brace "(" there ? The closing brace ")" is missing its partner.

你的程序(由正则表达式)如何知道这应该是两句话?