2013-06-20 17 views
5

Ich versuche, eine Parameterliste durch Regexp zu teilen. DieseRuby Regexp Komma, aber Komma in Klammern ignorieren

ist ein String mit meiner Parameterliste:

"a = b, c = 3, d = [1,3,5,7], e, f = g" 

Was ich will, ist:

["a = b", "c = 3", "d = [1,3,5,7]", "e", "f = g"] 

ich mit einem Look-Ahead versucht, aber Rubin nicht zulässt, dass Lookbehinds mit einem Dynamikbereich, so funktioniert das nicht:

Wie kann ich dem regexp sagen, alles in eckigen Klammern zu ignorieren?

+1

sind Sie garantiert ein "=" in jedem Split Sie vom Eingang haben wollen? Es könnte bessere Lösungen geben, um das zu tun, was Sie wollen, wenn Sie alle Einschränkungen posten könnten. – Dogbert

+0

@ Casimir, nicht sicher, warum Sie die Anführungszeichen aus der Eingabe entfernt haben, es ist eine Zeichenfolge, und das ist klarer, wenn sie von doppelten Anführungszeichen umgeben ist. – Dogbert

+0

@Dogbert und Casimir Deshalb setze ich die Zitate dort hinein. – Kurt

Antwort

7

Vielleicht so etwas wie das wäre für Sie arbeiten:

str.scan(/(?:\[.*?\]|[^,])+/) 

EDIT nach zweiten Gedanken.

Einfache nicht gierige Matcher werden in einigen Fällen von verschachtelten Klammern fehlschlagen.

+0

Dies. Ich mag das. Warum habe ich nicht daran gedacht? – Kurt

+1

Sei vorsichtig, schau dir meinen Schnitt an. Ich habe festgestellt, dass diese Lösung nicht für jeden Fall geeignet ist. – samuil

+0

Verschachtelte Klammern sind in diesem Fall nicht erlaubt, also sollte es kein Problem sein. Vielen Dank! – Kurt

2

Anstatt zu versuchen, alles mit einem Splitting-Regex zu erledigen, könnten Sie Ihre Array-Paare aufteilen und dann korrigieren.

input = "a = b, c = 3, d = [1,5], e = f" 
pairs = input.split(/,\s*/) 
pairs.each_with_index do |item, index| 
    if index > 0 && (item =~ /=/).nil? 
    pairs[index - 1] += ',' + item 
    pairs[index] = nil 
    end 
end 
pairs.delete_if { |item| item.nil? } 
puts pairs 

Ausgänge:

a = b 
c = 3 
d = [1,5] 
e = f 
+0

Dies ist meine aktuelle Lösung, aber ich fragte mich, ob es in einem Schritt möglich ist. – Kurt

Verwandte Themen