2016-04-17 9 views
0

Das RegexMuster funktioniert, wenn ich es in regexr.com versuchekönnen nicht Zeichenfolge in Anführungszeichen markieren Regex in Ruby mit

pattern = %r{(["'])(?:\\\1|[^\1])*?\1} 
string = %Q(var msg = 'hello' + 'world') 
string.gsub(pattern, '<span>\1</span>') 

ich die Ausgabe erwarten zu sein:

"var msg = <span>'hello'</span> + <span>'world'</span>" 

Aber anstatt ich bin bekommen:

# => "var msg = <span>'</span> + <span>'</span>" 
+0

Wäre es nicht 'regex =/([" ']) geschrieben (siehe: \\ \ 1 | [^ \ 1]) *? \ 1/',' string = "var msg = 'hallo' + 'welt'" '? –

+0

Huch, du hast nur die einzige Antwort gewählt, die bisher angeboten wurde 20 Minuten, nachdem Sie gepostet haben, können Quick-Draw-Optionen andere, möglicherweise bessere Antworten abschrecken und die noch vorhandenen kurzschließen pairing Antworten. Viele warten hier mindestens ein paar Stunden, bevor sie eine Auswahl treffen. Der Punkt ist, dass es keine Eile gibt, eine Auswahl zu treffen. –

+0

@CarySwoveland Es kann einfacher sein, aber das wird nicht allein lösen das Problem von OP – rock321987

Antwort

1

Denken Sie nicht, dass Sie falsch drucken und erfassen. Es sollte

pattern = %r{(["'])(\\\1|[^\1]*?)\1} 
         # ^^ 
         # || 
    #(This will capture the string hello etc. which are after quotes) 
string = %Q(var msg = 'hello' + 'world') 
string.gsub(pattern, '<span>\1\2\1</span>') 

Ideone Demo

+0

Danke für die Hilfe. Arbeitet noch an meiner Regex. –

0

Ich denke, es wäre klarer, einen regulären Ausdruck zu verwenden, die nicht Einfanggruppen hat.

r =/
    (?:'.+?') # match one or more of any character, lazily, surrounded by 
       # single quotes, in a non-capture group 
    |   # or 
    (?:".+?") # match one or more of any character, lazily, surrounded by 
       # double quotes, in a non-capture group 
    /x  # free-spacing regex definition mode 

, die Sie normalerweise

r = /(?:'.+?')|(?:".+?")/ 

Dann ist einfacher zu schreiben

"var msg = 'hello' + 'world'".gsub(r) { |s| "<span>%s</span>" % s } 
    #=> "var msg = <span>'hello'</span> + <span>'world'</span>" 
"var msg = \"hello\" + \"world\"".gsub(r) { |s| "<span>#{s}</span>" } 
    #=> "var msg = <span>\"hello\"</span> + <span>\"world\"</span>" 
"var msg = 'It is my' + 'friend Bubba'".gsub(r) { |s| "<span>"+s+"</span>" } 
    #=> "var msg = <span>'It is my'</span> + <span>'friend Bubba'</span>" 
+0

Sie machen eine Annahme, dass 'Hallo' wird immer in einfachen Anführungszeichen, was nicht der Fall ist, wie OP – rock321987

+0

@ Rock321987, danke. Ich habe das übersehen, weil es nur aus der Regex des OP abzuleiten ist. Ich habe meine Antwort geändert. –

Verwandte Themen