Это должно работать в Ruby 1.9 или Ruby 1.8, если он был скомпилирован с регулярным выражением Oniguruma двигатель (который является стандартным в Ruby 1.9):
result = text.split(/((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]"))\s+(?="?[A-Z])/)
разница заключается в том, что ваш код передает буквальную строку split()
, в то время как этот код передает буквальное регулярное выражение.
Он не будет работать с использованием обычного рулевого механизма Ruby (который является стандартным в Ruby 1.8), потому что он не поддерживает lookbehind.
Я также модифицировал регулярное выражение. Я заменил (\s|\r\n)
на \s+
. Мое регулярное выражение также разделяет предложения, которые имеют несколько пробелов между ними (ввод двух пробелов после того, как предложение распространено во многих культурах) и/или несколько разрывов строк между ними (разделение абзацев).
При работе с текстом Юникода, дальнейшее улучшение было бы заменить a-z
с \p{Ll}\p{Lo}
, A-Z
с \p{Lu}\p{Lt}\p{Lo}
и 0-9
с \p{N}
в различных классах символов в своем регулярном выражении. Класс символов с символами пунктуации можно разложить аналогично. Это потребует немного больше исследований, потому что нет никакого свойства Unicode для препинания в конце предложения.
Есть ли у вас пример проверки вашего регулярного выражения? –