Захватите ВСЕ КОПИИ «фразы» в текст - PullRequest
3 голосов
/ 21 февраля 2012

Я пытаюсь извлечь из длинного текста последовательность из нескольких слов, написанную заглавными буквами.Итак, в примере:

Вот пара слов текста.Если вам нужна дополнительная информация, пожалуйста, обратитесь к журналу ЗАПИСИ ДОКУМЕНТА.Он объясняет книгу «Путь к просветлению», которая решит все проблемы.Кроме того, не забывайте РУКОВОДСТВО ПО НАСТРОЙКЕ АВТОМОБИЛЯ.

Я хочу захватить DOCUMENT RECORDS, PATH TO ENLIGHTENMENT и CAR TUNE-UP GUIDELINES.

Следующие регулярные выражения работаютв Rubular (за исключением того, что они не совпадают с падежами, включая дефисы).

(\b([A-Z]|-|\s){3,}\b)    
(\b[A-Z- ]{3,}\b)
(\b[A-Z-\s]{3,}\b)

Однако я не могу заставить их работать в моей программе.Когда я запускаю следующий код в моей программе (это задача rake),

if content.to_s.scan(/\b[A-Z-\s]{3,}\b/)
  item_title = content.to_s.scan(/\b[A-Z-\s]{3,}\b/)

я получаю следующую ошибку:

... Long stack trace followed by:

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

Если я заменю \s простопробел, я не получаю сообщение об ошибке, но оно больше не соответствует чему-либо.Я использую Ruby 1.9.3.Почему это работает на сайте rubular.com, а не в моей программе?Я понимаю, что мое регулярное выражение небрежно.Как я могу улучшить это, чтобы быть более точным?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2012

Попробуйте это

     (?<=\s)(?:[A-Z\-\s]+)(?=\s|\.|,)

Это регулярное выражение находит все слова между пробелами и пробелами.

0 голосов
/ 11 декабря 2012

В ваших текущих регулярных выражениях, кажется, вам требуется, чтобы результирующая строка all-caps была длиной не менее 3 символов.Таким образом, быстрая версия была бы: /[A-Z][^a-z]+[A-Z]/ Это позволит использовать знаки препинания, такие как апострофы и тире, во фразах;избегая конечных пробелов и знаков препинания.

Однако, если есть хоть какой-то шанс, что вам понадобится сопоставить акцентированные и другие международные символы, вы можете переписать его, используя классы символов: /[[:upper:]][^[:lower:]]+[[:upper:]]/, чтоможет быть, все же будет яснее.

0 голосов
/ 21 февраля 2012

Не знаю о Ruby, но то, что вы описываете, можно сделать с помощью:

/\b[A-Z-]+(?:\s+[A-Z-]+)+\b/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...