Come posso estrarre una sottostringa all'interno di una stringa in Ruby?
Esempio:
String1 = "<name> <substring>"
Voglio estrarre substring
da String1
(cioè tutto nell'ultima occorrenza di <
e >
).
Come posso estrarre una sottostringa all'interno di una stringa in Ruby?
Esempio:
String1 = "<name> <substring>"
Voglio estrarre substring
da String1
(cioè tutto nell'ultima occorrenza di <
e >
).
Risposte:
String1.scan(/<([^>]*)>/).last.first
scan
crea una matrice che, per ciascuna <item>
in, String1
contiene il testo tra la <
e la >
in una matrice a un elemento (perché se usata con una regex contenente gruppi di acquisizione, la scansione crea una matrice contenente le acquisizioni per ogni corrispondenza). last
ti dà l'ultimo di quegli array e first
poi ti dà la stringa in esso.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
Non c'è bisogno di usare scan
, se abbiamo bisogno di un solo risultato.
Non c'è bisogno di usare Python match
, quando abbiamo Ruby String[regexp,#]
.
Vedere: http://ruby-doc.org/core/String.html#method-i-5B-5D
Nota: str[regexp, capture] → new_str or nil
if we need only one result
mia soluzione. Ed match()[]
è più lento, perché sono due metodi anziché uno.
string[regex]
possa essere altrettanto leggibile in questo scenario, quindi è quello che ho usato personalmente.
Puoi usare un'espressione regolare abbastanza facilmente ...
Consentire spazi attorno alla parola (ma non tenerli):
str.match(/< ?([^>]+) ?>\Z/)[1]
O senza gli spazi consentiti:
str.match(/<([^>]+)>\Z/)[1]
<>
debba effettivamente essere l'ultima cosa nella stringa. Se ad esempio la stringa foo <bar> baz
è consentita (e si suppone che dia il risultato bar
), ciò non funzionerà.
Ecco un approccio leggermente più flessibile usando il match
metodo. Con questo, puoi estrarre più di una stringa:
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"