Цикл по массиву, нацеленный только на заглавные буквы - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь l oop через строку, которую я преобразовал в массив, и нацеливаю только на заглавные буквы, которые я затем вставлю в пустое пространство перед заглавной буквой. Мой код проверяет первую заглавную букву и добавляет пробел, но я пытаюсь сделать это для следующей заглавной буквы, которая в данном случае является буквой "T". Любой совет будет оценен. Спасибо

  def break_camel(str)
  # ([A-Z])/.match(str)
  saved_string = str.freeze
  cap_index =str.index(/[A-Z]/)
  puts(cap_index)

   x =str.split('').insert(cap_index, " ")
  x.join

end
break_camel("camelCasingTest")

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

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

def break_camel(str)
  regex = /[a-z][A-Z]/
  if str.match(regex)
    cap_index = str.index(regex)
    str.insert(cap_index + 1, " ")
    break_camel(str)
  else
    str  
  end
end

break_camel("camelCasingTest") #=> "camel Casing Test"

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

В коде:

'camelCasingTest'.scan(/[A-Z]?[a-z]+/).join(' ') #=> "camel Casing Test"
1 голос
/ 08 апреля 2020

Намного проще работать с вашей строкой напрямую, используя String # gsub , чем разбивать ее на части, работать с каждой частью, а затем снова склеивать все вместе.

def break_camel(str)
  str.gsub(/(?=[A-Z])/, ' ')
end

break_camel("camelCasingTest")
  #=> "camel Casing Test"
break_camel("CamelCasingTest")
  #=> " Camel Casing Test"

Преобразует «позицию нулевой ширины» непосредственно перед каждой заглавной буквой (и после предшествующего символа, если он есть) в пробел. Выражение (?=[A-Z]) называется положительный взгляд .

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

def break_camel(str)
  str.gsub(/(?<=.)(?=[A-Z])/, ' ')
end

break_camel("CamelCasingTest")
  #=> "Camel Casing Test"

(?<=.) - это положительный взгляд за , для которого перед заглавной буквой должен стоять любой символ для сопоставление должно быть сделано.

Другой способ записать это следующим образом.

def break_camel(str)
  str.gsub(/(?<=.)([A-Z]))/, ' \1')
end

break_camel("CamelCasingTest")
  #=> "Camel Casing Test"

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

0 голосов
/ 08 апреля 2020

Вы должны реализовать свой собственный? Похоже, что titleize https://apidock.com/rails/ActiveSupport/Inflector/titleize имеет это.

...