2016-05-29 2 views
0

Для следующей строки, как я могу избавиться от одинарных кавычек?Ruby Regex сохранить одиночный апостроф, но удалить концевые апострофы

string: "'won't'" 
desired result: "won't" 

ищет выражения регулярных выражений, которые я могу использовать в gsub заменить '' с пустой строкой. например

arr = ["'don't'", "stop", "str%&eaming"] 
arr.map { |letter| gsub(/pattern/, ""} 

должен вернуть

=> ["don't", "stop", "streaming"] 
+1

Может у вас есть строка, '" „не“ или „„не““ 'или это всегда только одно слово с тремя одинарными кавычками/апострофами? Если этот символ появляется между двумя буквами это обязательно апостроф (должен быть сохранен)? –

ответ

1

Это работает для меня в IRB

arr.map { |l| l.gsub(/^'|'$|%&/, '') } 

Обратите внимание, что это не будет изменять оригинальный способ. Чтобы разрушить массив, вам нужно будет использовать метод bang, в данном случае arr.map!.

Вот простое объяснение.

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

Символ ^ используется для обозначения того, что линия начинается с определенной подстроки. С другой стороны, символ $ используется для указания строки, заканчивающейся определенной подстрокой. Оператор | распространен в области компьютерных наук для обозначения or условного.

Однако, если у вас есть строка, которая охватывает несколько строк, вам следует рассмотреть выражения \A и \z, чтобы указать начало и конец строки.

Мой выход в IRB следующим

=> ["don't", "stop", "streaming"] 
+0

Мне нравится, как легко масштабировать решение, т. е. если они хотят заменить одиночные кавычки между словами типа «не останавливаться» (хотя и не являются частью OP еще), это может быть изменено с '^ '|' $' to '^ '|' $ | '\ s' –

+0

'^'означает начало строки *, а не * string * в Ruby, аналогично для' $ 'на другом конце. Вы почти всегда хотите '\ A' и' \ z' в Ruby. –

+0

@muistooshort - Мои извинения. Вы правы –

1

Держите его просто.

def strip_single_quotes(str) 
    str[0]=="'" && str[-1]=="'" ? str[1..-2] : str 
end 

arr = ["'don't'", "stop", "str%&eaming", "'twas", "''twas'", "'fishin''", "she'd've"] 

arr.each { |word| puts "#{word.ljust(12)} -> #{strip_single_quotes(word) }" } 
'don't'  -> don't 
stop   -> stop 
str%&eaming -> str%&eaming 
'twas  -> 'twas 
''twas'  -> 'twas 
'fishin'' -> fishin' 
she'd've  -> she'd've 

Вы могли бы вместо того, чтобы написать тело strip_single_quotes следующим образом.

str =~ /\A'.*'\z/ ? str[1..-2] : str