2009-05-22 6 views
11

Ich versuche, eine mehrzeilige Zeichenfolge zu analysieren und den Rest der Zeile nach einem Muster zu erhalten.Was ist der "Ruby Way", um eine Zeichenfolge für einen einzelnen Schlüssel/Wert zu analysieren?

Text:

 
hello john 
your username is: jj 
thanks for signing up 

Ich möchte jj extrahieren, auch bekannt als alles nach "Ihr Benutzername ist:"

One way:

text = "hello john\nyour username is: jj\nthanks for signing up\n" 
match = text[/your username is: (.*)/] 
value = $1 

Aber das erinnert mich an perl .. und "liest" nicht so natürlich, wie mir gesagt wurde.

Gibt es einen saubereren Weg? AKA Ein "Ruby" Weg?

Dank

+1

Ruby war eigentlich ziemlich stark von Perl inspiriert; es sollte in dieselbe Nische passen wie Perl, aber mit einem schönen Objektsystem und einer Syntax, die sauberer und regelmäßiger war. Es hat tatsächlich eine Reihe von Funktionen direkt aus Perl, wie Ruby-p-i-e, obwohl einige der mehr Perl ähnliche Funktionen jetzt veraltet sind. –

Antwort

22

Ihr Code ist so ziemlich der Ruby-Weg. Wenn Sie die globale $1 nicht verwenden möchten, können Sie die 2 arg Version String#[] verwenden:

match = text[/your username is: (.*)/, 1] 
+0

Danke. Genau das habe ich gesucht! Dollar Globals hochzuziehen schien einfach zu alt zu sein. Ging und las die API-Dokumentation für Ruby, Klasse: String und da war es. http://www.ruby-doc.org/core/classes/String.html#M000786 – SWR

6

Die aufgeteilt Befehl mindbogglingly nützlich ist. Es teilt einen String in ein Array von Teilstrings und trennt sich auf alles, was Sie übergeben. Wenn Sie ihm keine Argumente geben, teilt er sich in Whitespaces. Also, wenn Sie wissen, dass das Wort Sie suchen die fünfte „Wort“ ist (Splitting auf beiden Räume und der Return-Zeichen), können Sie dies tun:

text = „Hallo John \ nIhr Benutzername ist: jj \ nDanke für Ihre Anmeldung \ n“
match = text.split [5]

..aber das ist vielleicht nicht ausreichend selbsterklärend, oder Sie wollen für Mehrwort-Matches zu ermöglichen. Sie können dies tun, anstatt:

Mittellinie = text.split ("\ n") [1]
match = midline.split ("username is:") .last

Oder vielleicht dies kurz und bündig so:

match = text [/ username ist: (. *)/1]

+0

ich würde das tun, aber split auf "" anstelle von "Ihr Benutzername ist:" –

+1

+1 für eine interessante Verwendung von Split, um das fünfte Wort zu bekommen, hatte ich nicht bemerkt, dass. –

+2

Wow, danke für die vielen Angriffswege.;) Ich hatte die Split-Möglichkeit nicht bemerkt, aber der eingehende Text ist nicht statisch (das Beispiel wurde stark vereinfacht), also wird es nicht funktionieren ... aber es war eine gute Möglichkeit, das Problem anzugehen. – SWR

4

nicht sicher, ob es mehr Ruby'ish, aber eine andere Option:

>> text = "hello john\nyour username is: jj\nthanks for signing up\n" 
>> text.match(/your username is: (.*)/)[1] 
=> "jj" 
+2

So würde ich es machen. Es ist der Lösung von [] technisch nicht überlegen, aber ich denke, die Absicht ist klarer, wenn man sie überfliegt. – Chuck

3

Es gibt auch Regexp#match, die ein MatchData Objekt zurückgibt, das alle Informationen enthält, die Sie möglicherweise möchten.

irb> match = /your username is: (.*)/.match "hello john\nyour username is: jj\nthanks for signing up\n" 
#=> #<MatchData:0x557f94> 
irb> match.pre_match 
#=> "hello john\n" 
irb> match.post_match 
#=> "\nthanks for signing up\n" 
irb> match[0] 
#=> "your username is: jj" 
irb> match[1] 
#=> "jj" 
Verwandte Themen