Это должно работать в Ruby 1.9 или в Ruby 1.8, если вы скомпилировали его с помощью механизма регулярных выражений Oniguruma (который является стандартным в Ruby 1.9):
result = text.split(/((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]"))\s+(?="?[A-Z])/)
Разница в том, что ваш код передает буквенную строку в split()
, тогда как этот код передает буквальное регулярное выражение.
Он не будет работать с использованием классического движка Ruby regex (который является стандартным в 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 для пунктуации в конце предложения.