2013-07-10 12 views
9

Wenn ich eine sehr lange Regex habe, wie eine Gurke Schritt Definition, was wäre der beste Weg, um es zu umbrechen?Wenn Ruby Regex nicht in Zeile passt

Beispiel möchte ich so etwas wie:

When /^I have a very long step definition here in my step definition file$/ do 
    ... 
end 

Pause in zwei Linien (diese nicht funktioniert :)

When /^I have a very long step definition here in /\ 
    /my step definition file$/ do 
    ... 
end 
+1

Verwenden Sie einen kürzeren Regex? oO –

+0

was meinst du mit zerlegung in 2 linien? '\ n'? –

+0

Sie können den 'x' Modifikator ... – HamZa

Antwort

13

Sie einen verbose regex mit dem /x Modifikator verwenden können, aber Sie dann müssen Räume explizit machen, weil sie ansonsten ignoriert werden. Ein weiterer Vorteil ist, dass dies ermöglicht es Ihnen, Ihre regex Kommentar (die, wenn sie lang ist, könnte eine gute Idee sein):

/^        # Match start of string 
I[ ]have[ ]a[ ]very[ ]long[ ] 
step[ ]definition[ ]here[ ] 
in[ ]my[ ]step[ ]definition[ ]file 
$        # Match end of string 
/x 
+0

hmm, guter Vorschlag, aber ich denke nicht, dass würde meine Schrittdefinitionen besser lesbar machen – SirLenz0rlot

+1

@ SirLenz0rlot lol, wenn dies es nicht lesbar macht, dann haben Sie keine anderen Optionen, da dies die ** Möglichkeit ist, strukturierte/lesbare Regexe zu schreiben . Ansonsten verlassen Sie sich einfach auf Ihren Editor und "wickeln" Sie die Zeilen. – HamZa

+0

ok danke. Ich hoffe, es würde eine sauberere Lösung geben. – SirLenz0rlot

1

Was

/a\ 
b/ 
# => /ab/ 
+0

wird ruiniert, wenn ich in der zweiten Zeile einrücken – SirLenz0rlot

-2

Ich weiß, dass Sie es in Ruby wollen, aber Ich kann Ihnen ein Beispiel geben, wie es in Perl realisiert werden kann. Ich denke wirklich, dass Sie die Idee dahinter auch in Ruby verwenden können.

my $re1 = "I have a very long step definition here in"; 
my $re2 = "my step definition file"; 

if ($line =~ m/^$re1 $re2$/i) { 
    ... 
} 

Die Idee ist, die Regex in eine Variable zu speichern und die Variable in die Regex schreiben.

+0

ist in der Tat eine Möglichkeit innerhalb Rubin. aber im Falle von Gurkenschrittdefinitionen würde dies die Lesbarkeit nicht erhöhen – SirLenz0rlot

1

Was ist mit String zu Regex-Transformation? Sie werden Syntax-Highlighting verlieren, aber ich würde sagen, es ist nicht so schlimm?

When(Regexp.new(
    '^My long? regex(?:es) that are '\ 
    '(?:maybe) broken into (\d+) lines '\ 
    'because they (?:might)be non-readable otherwise$' 
)) do |lines| 
    ... 
end 
# => /^My long? regex(?:es) that are (?:maybe) broken into (\d+) lines because they (?:might)be non-readable otherwise$/