2016-08-20 3 views
2

Я ищу регулярное выражение, чтобы соответствовать:рубин регулярное выражение экстракт слово одинарные кавычки

ciao: c'iao 'ciao' 

с:

ciao #every word excluding non-word character 
c'iao #including apostrophes 
ciao #excluding the quotes '' 

До сих пор я был в состоянии соответствовать первым требованиям 2 с :

/[\w']+/ 

но я борюсь с извлечением слова между одинарными кавычками (без учета котировок). Обратите внимание, что у меня не будет случая, когда слово с апострофом включено между кавычками (например, 'c'iao')

Я видел много похожих Q & A но не смог найти подходящих моих потребностей; Дополнительные очки для ответа, который включает в себя краткое описание :)

+1

Возможно ['/\w+(?:'\w+)*/'](http://rubular.com/r/Y0SLnzMRrb)? –

ответ

3

Вы можете использовать следующее выражение:

/\w+(?:'\w+)*/ 

См Rubular demo

Выражение соответствует:

  • \w+ - 1 или больше словных символов
  • (?:'\w+)* - ноль или более последовательностей (как (?:...)* не является группой захвата, что группы последовательность подшаблонов количественно с * квантификатора сопоставления 0 или более вхождений) из:
    • ' - апостроф
    • \w+ - 1 или более слов символов.

См short Ruby demo here:

"ciao: c'iao 'ciao'".scan(/\w+(?:'\w+)*/) 
# => [ciao, c'iao, ciao] 
+1

отлично, спасибо большое – davideghz

+0

Прекрасный код, Wiktor. –

0

Учитывая, что слова могут начинаться или заканчиваться апострофом или содержать несколько апострофа, я предлагаю первое расщепление на пробельном затем удаляя пары одинарных кавычек, которые окружают слова.

str = "'Twas because Bo didn't like Bess' or y'all's 'attitude'" 

str.split.map { |s| s =~ /\A'.+'\z/ ? s[1..-2] : s } 
    #=> ["'Twas", "because", "Bo", "didn't", "like", "Bess'", "or", "y'all's", "attitude"] 

Первым шагом производит

arr = str.split 
    #=> ["'Twas", "because", "Bo", "didn't", "like", "Bess'", "or", "y'all's", "'attitude'"] 

Регулярное выражение соответствует элементы arr, которые начинаются и заканчиваются с одиночной кавычки.

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