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?

Chowlett
quelle

Antworten:

52

Sie müssen den /xModifikator verwenden, der den Freiraummodus aktiviert .

In deinem Fall:

"bar" =~ /(foo|
           bar)/x
SilentGhost
quelle
48
Diese Antwort könnte verbessert werden, indem der Link durch eine detailliertere Erklärung ersetzt wird.
Mkataja
So:regexp = /(\d+)(\d+)/x
Evan Ross
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

mthorley
quelle
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/
Montells
quelle
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.

Kache
quelle
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