Заменить все не заглавные слова на ruby

Я хотел бы заменить все не прописные слова в тексте на "-". Длина слова.

Например, у меня есть следующий текст (немецкий):

Florian Homm wuchs als Sohn des mittelständischen Handwerksunternehmers Йоахим Хомм и сейнер Фрау Мария-Барбара "Уши" Хомм им гессенский Бад Хомбург в дер-хе-ауф. Sein Großonkel mütterlicherseits war der Unternehmer Йозеф Некерманн. Начальная школа университета Гарвардского университета, магистр делового администрирования и обучения в бизнес-школе, основанная в университете США, начала свою деятельность в инвестиционном банке Merrill Lynch, Danach War Er Be Be DEM US-Fondsanbiements der Schweizer Privatbank Юлиус Бар и дем США-Вермонгсвервалтер Твиди Браун....

должен быть преобразован в

Флориан Хомм ---- --- Сон --- ------------ Handwerksunternehmers Йоахим Хомм --- ------ Фрау Мария-Барбара "Уши" Хомм - --- ------- Бад Хомбург --- Хохе ---.....

5 ответов

Решение
▶ input.gsub(/\p{L}+/) { |m| m[0] != m[0].upcase ? '-'*m.length : m }
#⇒ "Florian Homm ----- --- Sohn --- ------------------ Handwerksunternehmers..."

Более чистое решение (кредит Кэри):

▶ input.gsub(/(?<!\p{L})\p{Lower}+(?!\p{L})/) { |m| '-' * m.length }

Вы можете попробовать что-то вроде этого для небольшого размера ввода:

В основном я:

  1. Разбить входную строку на пробельные символы
  2. Сопоставьте массив либо со словом (если оно не пишется с большой буквы), либо со словом, замененным на тире (если оно пишется с большой буквы)
  3. объединить с пробелами.

Вот так

s = "Florian Homm wuchs als Sohn des mittelständischen Handwerksunternehmers Joachim Homm und seiner Frau Maria-Barbara „Uschi“ Homm im hessischen Bad Homburg vor der Höhe auf. Sein Großonkel mütterlicherseits war der Unternehmer Josef Neckermann. Nach einem Studium an der Harvard University, das er mit einem Master of Business Administration an der Harvard Business School abschloss, begann Homm seine Tätigkeit in der US-amerikanischen Finanzwirtschaft bei der Investmentbank Merrill Lynch, danach war er bei dem US-Fondsanbieter Fidelity Investments, der Schweizer Privatbank Julius Bär und dem US-Vermögensverwalter Tweedy Browne...."

s.split(/[[:space:]]/).map { |word| word.capitalize == word ? word : '-' * word.length }.join(' ')

Относится ли это к вашей проблеме?

Ура!

Изменить: Для более эффективного использования памяти вы можете использовать регулярное выражение заменить gsub, проверьте этот другой ответ по mudasobwa /questions/3305789/zamenit-vse-ne-zaglavnyie-slova-na-ruby/3305798#3305798

Попробуйте что-то вроде этого

s.split.map { |word| ('A'..'Z').include?(word[0]) ? word : '-' * word.length }.join(' ')

Решение

Эта проблема сложнее, чем кажется!

Этот код может быть более требователен к памяти, чем другие, но я смею сказать, что он работает для более широкого диапазона (странных) немецких слов:

def hide_non_capitalized(text)
  text.split(/[[:space:]]/).map do |chars|
    first_letter = chars[/[[:alpha:]]/]
    if first_letter && first_letter == first_letter.downcase
      ## Keep non-letters :
      chars.gsub(/[[:alpha:]]/,'-')
      ## Replace every character :
      # '-' * chars.size
    else
      chars
    end
  end.join(' ')
end

Он разбивает текст на блоки символов и заменяет все буквы блока, если его первая буква строчная. Этот код требует Ruby 2.4, потому что 'ä'.upcase все еще 'ä' до Ruby 2.3.

Тестовое задание

puts hide_non_capitalized(text)
#=> Florian Homm ----- --- Sohn --- ----------------- Handwerksunternehmers Joachim Homm --- ------ Frau Maria-Barbara „Uschi“ Homm -- ---------- Bad Homburg --- --- Höhe ---. Sein Großonkel ----------------- --- --- Unternehmer Josef Neckermann. Nach ----- Studium -- --- Harvard University, --- -- --- ----- Master -- Business Administration -- --- Harvard Business School ---------, ------ Homm ----- Tätigkeit -- --- US-amerikanischen Finanzwirtschaft --- --- Investmentbank Merrill Lynch, ------ --- -- --- --- US-Fondsanbieter Fidelity Investments, --- Schweizer Privatbank Julius Bär --- --- US-Vermögensverwalter Tweedy Browne....

hide_none = "Änderung. „Uschi“, Attaché-case Maria-Barbara US-Fondsanbieter. Die Richter/-innen. Jede(r) 1234 \"#+?\""
puts hide_non_capitalized(hide_none)
#=> Änderung. „Uschi“, Attaché-case Maria-Barbara US-Fondsanbieter. Die Richter/-innen. Jede(r) 1234 "#+?"


hide_all = "öfters. „word“ lowercase-Uppercase jede(r) not/exactly/a/word"
puts hide_non_capitalized(hide_all)
#=> ------. „----“ ------------------- ----(-) ---/-------/-/----
r = /
    (?<![[:alpha:]]) # do not match a letter (negative lookbehind)      
    [[:lower:]]      # match a lowercase letter
    [[:alpha:]]*     # match zero or more letters
    /x               # free-spacing regex definition mode

str = "Frau Maria-Barbara „Uschi“ Homm im hessischen Bad Homburg vor der Höhe auf."

str.gsub(r) { |m| '-'*m.size }
  #=> "Frau Maria-Barbara „Uschi“ Homm -- ---------- Bad Homburg --- --- Höhe ---."
"die Richter/-innen".gsub(r) { |m| '-'*m.size }
  #=> "--- Richter/------" 
"Jede(r) Anwältin und Anwalt".gsub(r) { |m| '-'*m.size }
  #=> "Jede(-) Anwältin --- Anwalt" 
Другие вопросы по тегам