我在http://en.wikipedia.org/wiki/Sentence_boundary_disambiguation找到了这个用于句子边界消歧的正则表达式语句,但我无法在Ruby拆分语句中使用它。我对正则表达式不太好,所以也许我错过了什么?这是声明:
((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[A-Z])
这是我在Ruby中尝试的,但没有去:
text.split("((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[A-Z])")
答案 0 :(得分:2)
如果你使用Oniguruma正则表达式引擎(这是Ruby 1.9中的标准)编译它,它应该在Ruby 1.9或Ruby 1.8中工作:
result = text.split(/((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]"))\s+(?="?[A-Z])/)
区别在于您的代码将文字字符串传递给split()
,而此代码传递了一个文字正则表达式。
使用经典的Ruby正则表达式引擎(这是Ruby 1.8中的标准)是行不通的,因为它不支持lookbehind。
我还修改了正则表达式。我将(\s|\r\n)
替换为\s+
。我的正则表达式还会拆分它们之间有多个空格的句子(在一个句子在很多文化中很常见后输入两个空格)和/或它们之间有多个换行符(分隔段落)。
使用Unicode文本时,进一步的改进是将a-z
替换为\p{Ll}\p{Lo}
,将A-Z
替换为\p{Lu}\p{Lt}\p{Lo}
,将0-9
替换为\p{N}
在正则表达式中的各种字符类中。带有标点符号的字符类可以类似地进行扩展。这需要更多的研究,因为句末标点符号没有Unicode属性。