0

我目前遇到了我认为是一项简单任务的麻烦。

如果我有一个像这样的字符串:

第 1 句“双引号短语” 第 1 句。第 2 句?第 3 句(括号中的数字,如 1.2 不应拆分)。句子 4 ' 单引号短语。其余的引用“第 4 句。第 5 句!

我想把它分成:

第 1 句“双引号短语”第 1 句。

第2句?

第 3 句(括号中的数字,如 1.2 不应拆分)。

句子 4 ' 单引号短语。引用的其余部分”第 4 句。

第五句!

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

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

4

2 回答 2

1

尝试以下正则表达式

(?:^|\s).+?[.!?](?:\s|$)
于 2013-03-09T21:22:27.593 回答
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!

然而它并不完美。如果您将第rest4 句中的内容更改为Rest它失败。

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

The dot ". is a period.

请注意,我忘记了(一个错误)结束语。或以下(两句话):

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

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

于 2013-03-09T21:33:56.637 回答