Wie kann ich in Ruby einen Teilstring aus einem String extrahieren?
Beispiel:
String1 = "<name> <substring>"
Ich möchte extrahieren substring
aus String1
(dh alles , was in den letzten Vorkommen <
und >
).
Wie kann ich in Ruby einen Teilstring aus einem String extrahieren?
Beispiel:
String1 = "<name> <substring>"
Ich möchte extrahieren substring
aus String1
(dh alles , was in den letzten Vorkommen <
und >
).
Antworten:
String1.scan(/<([^>]*)>/).last.first
scan
Erstellt ein Array, das für jedes <item>
In String1
den Text zwischen dem <
und dem >
in einem Ein-Element-Array enthält (da bei Verwendung mit einem regulären Ausdruck, der Erfassungsgruppen enthält, der Scan ein Array erstellt, das die Erfassungen für jede Übereinstimmung enthält). last
gibt Ihnen das letzte dieser Arrays und first
gibt Ihnen dann die Zeichenfolge darin.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
Keine Notwendigkeit zu verwenden scan
, wenn wir nur ein Ergebnis benötigen.
Keine Notwendigkeit, Pythons zu verwenden match
, wenn wir Rubys haben String[regexp,#]
.
Sehen: http://ruby-doc.org/core/String.html#method-i-5B-5D
Hinweis: str[regexp, capture] → new_str or nil
if we need only one result
in meiner Lösung darauf hingewiesen . Und match()[]
ist langsamer, weil es zwei Methoden statt einer sind.
string[regex]
es in diesem Szenario genauso lesbar sein kann, also habe ich es persönlich verwendet.
Sie können dafür ganz einfach einen regulären Ausdruck verwenden ...
Leerzeichen um das Wort herum zulassen (aber nicht behalten):
str.match(/< ?([^>]+) ?>\Z/)[1]
Oder ohne die erlaubten Leerzeichen:
str.match(/<([^>]+)>\Z/)[1]
<>
tatsächlich das Letzte in der Zeichenfolge sein muss. Wenn zB die Zeichenfolge foo <bar> baz
zulässig ist (und das Ergebnis liefern soll bar
), funktioniert dies nicht.
Hier ist ein etwas flexiblerer Ansatz mit der match
Methode. Mit dieser Option können Sie mehr als eine Zeichenfolge extrahieren:
s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)
# Use 'captures' to get an array of the captures
matchdata.captures # ["ants","pants"]
# Or use raw indices
matchdata[0] # whole regex match: "<ants> <pants>"
matchdata[1] # first capture: "ants"
matchdata[2] # second capture: "pants"