2016-06-24 3 views
0

Ich habe die folgenden Test string:Rubin regulären Ausdruck „bis leere Zeile gehen“

puts "Wrong guess receives feedback" 
p (game.guess(11) == "Too high!") 

puts "Wrong guess deducts from remaining guesses" 
p (game.remaining_guesses == 3) 

auf Englisch Ich versuche:

capture everything after "puts " 
until you get to a blank line 
(aka beginning of a string followed immediately by end of string) 

Ich weiß, wie „bis gehen in etwas hineinlaufen ". Wie zum Beispiel „gehen, bis Sie in ein doppeltes Anführungszeichen laufen“

[6] pry(main)> re = /[^"]+/ 
=> /[^"]+/ 
[7] pry(main)> "stuff before a quote\"".slice(re) 
=> "stuff before a quote" 

Ich denke, re = /^$/ wird „eine leere Zeile erfassen“ http://rubular.com/r/E5F7wH6sNq

So Wie würde ich mich über „alles nach‚puts‘Einfangen und bis du zu einer Leerzeile kommst? Ich habe folgendes versucht:

re = /puts ([^^$]+)/ 

Aber es hat nicht funktioniert: http://rubular.com/r/yUhA090fLm

Antwort

1
str.scan /(?<=puts).*?(?=\R\R|\z)/m                           
#⇒ [ 
# [0] "\"Wrong guess receives feedback\"\np (game.guess(11) == \"Too high!\")", 
# [1] "\"Wrong guess deducts from remaining guesses\"\np (game.remaining_guesses == 3)" 
# ] 

Positive Lookbehind puts, gefolgt von nicht-gierig alles bis zwei Wagenrücklauf/Leerzeilen (beachten Sie, dass \R letztere auf erfasst jede Plattform, einschließlich Win und Mac OS,) oder das Ende der Eingabe.

+0

Ich hatte keine Ahnung von '\ R'. Gute! –

1

Dieser Weg wäre, es zu tun:

re = /puts (.*?)\r?\n\r?\n/m 

.* bedeutet „Null oder mehr von jedweden Zeichen außer Zeilenumbrüchen ". Ich werde später die ? erklären.

Der m (für "multiline") Modifikator am Ende bedeutet es "Null oder mehr beliebiger Zeichen einschließlich Zeilenumbrüche".

Die \r?\n\r?\n ist zwei Zeilenumbrüche in Folge, die auf verschiedenen Systemen unterschiedlich dargestellt werden können. Sie könnten diesen Teil stattdessen durch $^ ersetzen, aber dann wird die (.*?) am Ende eine abschließende Newline enthalten, weil die $ für "Ende der Zeile" nach einem Newline, nicht vorher übereinstimmt.

Die ? macht .* "faul" - es passt so wenig wie möglich, anstatt "gierig" und passend so viel wie möglich zu sein. Dies ist relevant, wenn Sie mehrere Leerzeilen haben: Vermutlich soll es nicht gierig mit "null oder mehr eines beliebigen Zeichens bis zur letzten leeren Zeile" übereinstimmen. Sie wollen, dass es "null oder mehr irgendeines Charakters bis zur ersten leeren Zeile" entspricht.

Eines der Probleme mit Ihrer /puts ([^^$]+)/ ist, dass [^abc] effektiv eine Abkürzung für "ein beliebiges Zeichen, das nicht a, b oder c ist". Es bedeutet nicht "kein 'a' gefolgt von einem 'b' gefolgt von einem 'c'".

+0

Das obige wird unter Windows fehlschlagen. – mudasobwa

+0

@mudasobwa: Guter Punkt, bearbeitet. –

+0

Für Rails2 + gibt es '\ R' Matcher. – mudasobwa