regulares metodos manejo expresiones cadenas ruby string split

metodos - manejo de cadenas en ruby



¿Separar una cadena en Ruby, ignorando el contenido de paréntesis? (2)

Necesito dividir una cadena en una lista de partes en Ruby, pero necesito ignorar las cosas dentro de paramentheses. Por ejemplo:

A +4, B +6, C (hello, goodbye) +5, D +3

Me gustaría que la lista resultante sea:

[0]A +4 [1]B +6 [2]C (hello, goodbye) +5 [3]D +3

Pero no puedo simplemente dividir las comas, porque eso dividiría el contenido de los paréntesis. ¿Hay alguna manera de dividir las cosas sin preprocesar las comas entre llaves en otra cosa?

Gracias.


Prueba esto:

s = ''A +4, B +6, C (hello, goodbye) +5, D +3'' tokens = s.scan(/(?:/(.*?/)|[^,])+/) tokens.each {|t| puts t.strip}

Salida:

A +4 B +6 C (hello, goodbye) +5 D +3

Una breve explicación:

(?: # open non-capturing group 1 /( # match ''('' .*? # reluctatly match zero or more character other than line breaks /) # match '')'' | # OR [^,] # match something other than a comma )+ # close non-capturing group 1 and repeat it one or more times

Otra opción es dividir en una coma seguido de algunos espacios solo cuando el primer paréntesis que se puede ver al mirar hacia adelante es un paréntesis de apertura (o no hay paréntesis en absoluto, es decir, el final de la cadena):

s = ''A +4, B +6, C (hello, goodbye) +5, D +3'' tokens = s.split(/,/s*(?=[^()]*(?:/(|$))/) tokens.each {|t| puts t}

producirá el mismo resultado, pero el método de scan me parece más limpio.


string = "A +4, B +6, C (hello, goodbye) +5, D +3" string.split(/ *, *(?=[^/)]*?(?:/(|$))/) # => ["A +4", "B +6", "C (hello, goodbye) +5", "D +3"]

Cómo funciona esta expresión regular:

/ *, * # find comma, ignoring leading and trailing spaces. (?= # (Pattern in here is matched against but is not returned as part of the match.) [^/)]*? # optionally, find a sequence of zero or more characters that are not '')'' (?: # <non-capturing parentheses group> /( # left paren '')'' | # - OR - $ # (end of string) ) ) /