2013-03-09 55 views
0

我目前运行到麻烦,我认为将是一个简单的任务。将字符串分割成句子了常用标点符号

如果我有这样的字符串:

句子1“双引号的短语”句子1.句子2?第3句(括号中的数字不应该被拆分)。句子4'单引号短语。剩下的引用'句子4.句子5!

我想把它分成:

句子1“双引号的短语”句子1.

句2?

句3(数字像1.2括号不应被分割)。

句子4'单引号的短语。报价休息”一句4.

5句!

显然,一个简单的"\.|\?|!"比赛将无法正常工作。任何帮助表示赞赏。

我认识的正则表达式可能不是我们的最佳工具,但除非有我失踪另一个快速简单的解决办法,我过去的不归路。

+0

什么是工具/语言? – nhahtdh 2013-03-09 21:26:32

+0

@使用正则表达式的PHP。 – Phil 2013-03-09 21:30:41

+0

@Phil只要你的语言支持正则表达式替换,你可以将sed行翻译成你的语言。但请阅读我答案中的其他评论。 – Kent 2013-03-09 21:38:16

回答

1

尝试以下的正则表达式

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

我想你可能误解了我,我不是字面上匹配说句子的文本。 – Phil 2013-03-09 21:32:51

+0

@Phil那么分裂的标准是什么? – VladL 2013-03-09 21:34:37

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. 

你的程序如何(通过正则表达式)知道这应该是两个句子?