Quiero dividir una cadena en una matriz que incluya cada 2 palabras de la cadena original como se muestra a continuación:
Ex: str = "how are you to day" output = ["how are", "are you", "you to", "to day"]¿Alguien puede dar solución? ¡muchas gracias!
Aporte
str = "how are you to day"Código
p str.split(/\s/) .each_cons(2) .map { |str| str.join(" ") }Producción
["how are", "are you", "you to", "to day"]Aquí hay un enfoque, que utiliza un truco de expresiones regulares para duplicar la penúltima palabra en la cadena de entrada:
input = "how are you to day" input = input.gsub(/(?<=\s)(\w+)(?=\s)/, "\\1 \\1") output = input.scan(/\w+ \w+/).flatten puts outputEsto imprime:
how are are you you to to dayAquí hay un par de formas de hacerlo. Ambos usan la forma de String#gsub que toma una expresión regular como argumento y ningún bloque, devolviendo un enumerador. Esta forma de gsub simplemente genera coincidencias de la expresión regular; no tiene nada que ver con el reemplazo de cadenas.
str = "how are you to day"Use una expresión regular que contenga una anticipación positiva
r = /\w+(?=( \w+))/ str.gsub(r).with_object([]) { |s,a| a << s + $1 } #=> ["how are", "are you", "you to", "to day"] He encadenado el enumerador str.gsub(r) a Enumerator#with_object . String#gsub es un reemplazo conveniente para String#scan cuando la expresión regular contiene grupos de captura. Consulte String#scan para obtener una explicación de cómo trata los grupos de captura.
Podemos escribir la expresión regular en modo de espacio libre para que se autodocumente.
r = / \w+ # match >= 1 word characters (?= # begin a positive lookahead ( \w+) # match a space followed by >= 1 word characters and save # to capture group 1 ) # end positive lookahead /x # invoke free-spacing regex definition modeEnumerar pares de palabras sucesivas en la picadura
enum = str.gsub(/\w+/) loop.with_object([]) do |_,a| a << enum.next + ' ' + enum.peek end #=> ["how are", "are you", "you to", "to day"] Consulte Enumerator#next y Enumerator#peek . Después de que next devuelva la última palabra en la cadena, se genera una StopIteration peek se maneja mediante loop saliendo del bucle y devolviendo la matriz a . Consulte Kernel#bucle .