2016-05-07 4 views
-2

Я хотел бы удалить средний (не первый и последний символ) каждого слова в строке.Удалить середину каждого слова

"Bob" #=> "Bb" 
"12309123" #=> "13" 
"Davy Jones" #=> "Dy Js" 

Как я могу это сделать?

+1

Каков ожидаемый результат для '' A ''или' 'Be?'? –

+3

Привет и добро пожаловать в SO! Пожалуйста, прочитайте [this] (http://stackoverflow.com/help/how-to-ask) сообщение о том, как задавать лучшие вопросы, которые помогут людям дать вам лучшие ответы. В частности, отправьте код, который вы пробовали, и что конкретно вас беспокоит. –

+0

@Iggy На всякий случай, если вы хотите достичь этого без использования регулярных выражений, мой ответ показывает вам, как вы можете это сделать. – Aph

ответ

3

Заменить (?<=\S)\S+(?=\S) ничего

(?<=\S) является, который проверяет просмотра назад есть не пробел перед тем.

(?=\S) - это взгляд, который проверяет наличие символа без пробела после.

Примечание: Я не знаю точно, что вы называете «словом», возможно, класс символов \w лучше подходит для ваших нужд. В этом случае вы можете избежать lookarounds и написать шаблон с не словесными границами, как это:

\B\w+\B 
+0

Существует небольшая, легко фиксируемая проблема: «Как теперь, коричневая корова?». Gsub (/ (? <= \ S) \ S + (? = \ S) /, "") # => "Hw n, bn c? "', но должен возвращать '' Hw nw, bn cw? "', поскольку OP только хочет удалить средние символы «каждого слова», а запятая и вопросительный знак не являются частями слов. –

+0

@CarySwoveland: как вы можете видеть, я дал другой рисунок в заметке для этого случая (если слово в вопросе означает «слова-символы»). –

+0

Ах, '\ B \ w + \ B' очень круто! –

1

это не так умно, может быть, но он делает то же самое: "my dog has fleas".gsub(/(\w)\w+(\w)/, "\\1\\2") #=>my dg hs fs

ideone demo/ regex demo

+0

В Ruby вам нужно написать 's =« у моей собаки есть блохи »; s.gsub (/ (\ w) \ w + (\ w) /, '\ 1 \ 2') # => "my dg hs fs" или 's.gsub (/ (\ w) \ w + (\ w) /) {$ 1 + $ 2} # => "my dg hs fs". Я не думаю, что Ruby поддерживает опцию 'g'. –

+0

, похоже, работает: $ stdout.write («у моей собаки есть блохи» .gsub (/ (\ w) \ w + (\ w) /, "\\ 1 \\ 2")) http://ideone.com/ q11iit – sweaver2112

+1

@CarySwoveland, Ruby не поддерживает флаг 'g'. Для этого «gsub». –

2

Просто используйте String's [] срез:

foo = 'barbaz' 
foo[1..-2] = '' 
foo # => "bz" 
+1

Вопрос включает в себя «... каждое слово в строке». –

+0

Определите слово. ОП не определил, что и до тех пор, пока он не продолжит с кодом, не будет полезен. –

1

Если вы хотите ACH ieve это без использования регулярных выражений:

original = 'Davy Jones'.split() 

original.each do |string| 
    words = string.split(//) 
    no_middle = "#{words[0]}#{words[words.length- 1]}" 
    print no_middle 
    print ' ' 
end 

Выход:

Dy Js 
0

Вы можете просто использовать стандартный метод рубин String#gsub. Вот как это выглядит:

string.gsub(/(\w)\w+(\w)/, "\\1\\2") 

Это соответствует только при наличии 3 или более символов, используя \w+ в качестве внутреннего рисунка Сличителя. В качестве лучшего решения, чем использование \w* там же, нет потери производительности, случайно сопоставив 2 символьных слова и заменив это слово на себя.

В качестве альтернативы, вы можете поставить блок #gsub, который вызывается на каждом матче:

string.gsub(/\b\w\w\w+\b/) {|s| s[0]+s[-1] } 

версия блока делает уверен, что по крайней мере 3-х символов совпадают, в целях повышения производительности, не вызывая блок и строку конкатенации, если это не требуется. Существуют и другие (возможно, более эффективные) выражения регулярных выражений, которые могут быть использованы здесь, но это подходит для цели просто отлично.

#gsub также имеет модификацию на месте, которую вы можете использовать, называется #gsub!. Он работает так же, но изменит строку, которую вы передадите ей. Я приводил примеры с #gsub, но вы можете использовать те же методы с #gsub!, если это то, что вы предпочитаете использовать.

А вот пример, используя ваши образцы строк и еще один, используя оба метода:

strings = [ \ 
    "Bob",   #=> "Bb" 
    "12309123", #=> "13" 
    "Davy Jones", #=> "Dy Js" 
    "How now brown cow, may your day be a model of happiness" 
] 

strings.each do |string| 
    puts "String '#{string}' becomes '#{string.gsub(/(\w)\w+(\w)/, "\\1\\2")}'" 
    puts "String '#{string}' becomes '#{string.gsub(/\b\w\w\w+\b/) {|s| s[0]+s[-1] }}'" 
end 

Этот выход следующее:

String 'Bob' becomes 'Bb' 
String 'Bob' becomes 'Bb' 
String '12309123' becomes '13' 
String '12309123' becomes '13' 
String 'Davy Jones' becomes 'Dy Js' 
String 'Davy Jones' becomes 'Dy Js' 
String 'How now brown cow, may your day be a model of happiness' becomes 'Hw nw bn cw, my yr dy be a ml of hs' 
String 'How now brown cow, may your day be a model of happiness' becomes 'Hw nw bn cw, my yr dy be a ml of hs' 
1
str = "How now, brown cow, are you a Jersey?" 

str.gsub(/\w+/) { |s| (s.size==1) ? s : s[0]+s[-1] } 
    #=> "Hw nw, bn cw, ae yu a Jy?" 

... но @ CasimiretHippolyte-х

str.gsub(/\B\w+\B/, "") 
    #=> "Hw nw, bn cw, ae yu a Jy?" 

- мяука кота.

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