2010-05-01 2 views
0

Я нашел это выражение регулярного выражения на http://en.wikipedia.org/wiki/Sentence_boundary_disambiguation для значения границ границ предложения, но не могу использовать его в статусе разбиения Ruby. Я не слишком хорош с регулярным выражением, так что, может быть, я чего-то не хватает? Это Постулаты:Преобразование выражения регулярного выражения для извлечения предложения в 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

Это должно работать в 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 для препинания в конце предложения.

+0

Привет, спасибо за руководство Oniguruma. Я пытаюсь использовать драгоценный камень, поэтому мне не нужно повторно компилировать свой рубин 1.8: http://oniguruma.rubyforge.org/. Это похоже на работу, но я получаю ноль, если я это делаю: reg = Oniguruma :: ORegexp.new ('((? <= [A-z0-9)] [.?!]) | (? <= [A- z0-9] [.?!] ")) \ s + (? ="? [AZ]) ') , а затем reg.scan (текст). Должен ли этот способ работать? – DavidP6

+0

Я тестирую ваше регулярное выражение в ruby ​​1.9.2, используя строку «Просто используйте поиск google.com. Вам нравится bing? Или, может быть, используйте Yahoo вместо этого». Я заметил, что он создает элементы с пустым пространством между каждым результатом. –

+0

@ArisBartee: Я видел то же самое. Не удалось выяснить, как исправить регулярное выражение. Я удалил следующие пробелы: 'result = text.split (/ ((? <= [A-z0-9)] [.?!]) | (? <= [A-z0-9] [.?! ] ")) \ s + (? ="? [AZ]) /). reject {| s | s.empty? или s.nil? } ' – squarism

Смежные вопросы