Teilen Sie Ruby Regex auf mehrere Zeilen


78

Dies ist möglicherweise nicht ganz die Frage, die Sie erwarten! Ich möchte keinen regulären Ausdruck, der über Zeilenumbrüche hinweg übereinstimmt. Stattdessen möchte ich einen langen regulären Ausdruck schreiben, den ich aus Gründen der Lesbarkeit in mehrere Codezeilen aufteilen möchte.

Etwas wie:

"bar" =~ /(foo|
           bar)/  # Doesn't work!
# => nil. Would like => 0

Kann es gemacht werden?

Antworten:



123

Die Verwendung von% r mit der Option x ist die bevorzugte Methode.

Siehe dieses Beispiel aus dem Github Ruby Style Guide

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x

regexp.match? "start groupalt2end"

https://github.com/github/rubocop-github/blob/master/STYLEGUIDE.md#regular-expressions


5
Das folgende Beispiel. Kommentare im regulären Ausdruck wirken sich positiv auf die Wartbarkeit aus.
Paul Cantrell

8
Oder mit / anstelle von% r, weil sich rubocop beschwert, wenn ein regulärer Ausdruck nicht zwischen Schrägstrichen liegt. Auch ihr
Styleguide,

3

Sie können verwenden:

"bar" =~ /(?x)foo|
         bar/

8
Diese Antwort war hilfreich für meine Situation, aber erst nachdem ich nach dem gesucht hatte, was (? X) bedeutete, und mehr Kontext hinzufügen konnte. Ich wäre nett, wenn diese Antwort aktualisiert würde, um genauer zu beschreiben, was sie illustriert. Für andere Interessierte fand ich die Hinweise zum (? On-off) -Konstrukt
Ben Parizek

@ BenParizek Vielleicht könnten Sie hier eine kurze Erklärung als Kommentar hinzufügen?
Peter Berg

Ich bin kein Experte für dieses Thema, aber so wie ich es verstehe, sagen die meisten Antworten hier verschiedene Versionen derselben Sache. Das Problem ist, dass komplexe reguläre Ausdrücke schwer zu lesen sind. Die allgemeine Antwort lautet: Sie können den Freiraummodus aktivieren, um Regexes besser lesbar zu machen. Es gibt verschiedene Möglichkeiten, den Freiraummodus zu aktivieren. 1) Sie können den Modifikator nach dem Endbegrenzer hinzufügen. /myregex/x2) Sie können den Freiraummodus mithilfe des Konstrukts (? On-off) umschalten. /myregex(?x) with free spacing/3) Sie können die %r{myregex}xSyntax verwenden.
Ben Parizek

1

Anstatt den Regex in der Mitte des Ausdrucks zu schneiden, schlage ich vor, ihn in Teile zu zerlegen:

full_rgx = /This is a message\. A phone number: \d{10}\. A timestamp: \d*?/

msg = /This is a message\./
phone = /A phone number: \d{10}\./
tstamp = /A timestamp: \d*?/

/#{msg} #{phone} #{tstamp}/

Ich mache das gleiche für lange Saiten.


Ich ging mit dieser Antwort über die anderen, die den /xModifikator empfahlen, weil ich \süberall hätte streuen müssen . Das Aufbrechen des regulären Ausdrucks war viel schneller und wohl einfacher zu lesen und zu warten.
Agressen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.