Tengo una cadena como:
string1: http://localapp/lkasdjasd/answers/156, ¿Lorem ipsum dolor? ¿Es Lorem, no? | aquí está la respuesta
Necesita dividir la cadena en la primera barra vertical después de la primera coma:
arr = line.split(',') key = arr[0].split('/')[-1].to_i title = arr[1] desc = arr[2]Hasta ahora solo descubrí cómo obtener la clave.
Puedes usar
/\A(?:[^,]*[^\d,])?(\d+),([^|]*)\|\s*(.+)/Vea la demostración de Rubular . Detalles :
\A - comienzo de la cadena(?:[^,]*[^\d,])? - una secuencia opcional de cero o más que no sean comas y luego un carácter que no sea un dígito y una coma(\d+) - Grupo 1: uno o más dígitos, - una coma([^|]*) - Grupo 2: cero o más caracteres que no sean tuberías\| - un | carbonizarse\s* - cero o más espacios en blanco(.+) - Grupo 3: uno o más caracteres que no sean de salto de línea tantos como sea posible.Vea una demostración de Ruby :
s = 'http://localapp/lkasdjasd/answers/156, Lorem ipsum dolor? is it Lorem, nah? | Here is the answer' /\A(?:[^,]*[^\d,])?(?<key>\d+),(?<title>[^|]*)\|\s*(?<desc>.+)/ =~ s puts "Key: #{key}\nTitle: #{title}\nDescription: #{desc}"Producción:
Key: 156 Title: Lorem ipsum dolor? is it Lorem, nah? Description: Here is the answerVoto por la respuesta: https://stackoverflow.com/a/69299320/13841038 en el que puede llamar a .to_i y .strip mientras imprime
key.to_i title.strip desc.stripSi no prefiere las expresiones regulares, el siguiente fragmento es una versión modificada de su solución
str = "http://localapp/lkasdjasd/answers/156, Lorem ipsum dolor? is it Lorem, nah? | Here is the answer" pipe_arr = str.split('|') arr = pipe_arr[0].split(',') key = arr[0].split('/')[-1].to_i title = (arr[1] + ',' + arr[2]).strip desc = pipe_arr[1].stripLo siguiente responde a lo que se pide en el título y en la tercera línea, que son inequívocos. Sin embargo, eso no es consistente con el resultado deseado.
r = /\A([^,]*,[^|]*)\|(.*)/x "Little Miss Muffett, sat on | a tuffet".scan(r).first #=> ["Little Miss Muffett, sat on ", " a tuffet"] "Little | Miss, Muffett, sat on |, a | tuffet".scan(r).first #=> ["Little | Miss, Muffett, sat on ", ", a | tuffet"]Podemos escribir la expresión regular en modo de espacio libre para que se autodocumente.
r = / \A # match beginning of string ( # begin capture group 1 [^,]* # match 0 or more chars other than a comma , # match a comma [^|]* # match 0 or more chars other than a pipe ) # end capture group 1 \| # match a pipe (.*) # match 0 or more chars and save to capture group 2 /x # invoke free-spacing regex definition modeConsulte String#scan para obtener una explicación de cómo el método trata las expresiones regulares que contienen grupos de captura. 1
Una segunda forma, que no usa una expresión normal, es usar String#index :
def split_it(str) i = str.index(',') return nil if i.nil? j = str.index('|', i+1) j.nil? ? nil : [str[0,j-1], str[j+1..-1]] end split_it("Little Miss Muffett, sat on | a tuffet") #=> ["Little Miss Muffett, sat on", " a tuffet"] split_it("Little | Miss, Muffett, sat on |, a | tuffet") #=> ["Little | Miss, Muffett, sat on", ", a | tuffet"]1 Una alternativa, que daré sin explicación, es la siguiente: "Pequeña | Señorita, Muffett, se sentó en |, a | tuffet".match(/\A[^,] ,[^|] \K|/) && [$`, $'] #=> ["La pequeña | señorita, Muffett, se sentó en ", ", un | tuffet"].