Come posso estrarre una sottostringa all'interno di una stringa in Ruby?
Esempio:
String1 = "<name> <substring>"
Voglio estrarre substringda 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 substringda String1(cioè tutto nell'ultima occorrenza di <e >).
Risposte:
String1.scan(/<([^>]*)>/).last.first
scancrea una matrice che, per ciascuna <item>in, String1contiene 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). lastti dà l'ultimo di quegli array e firstpoi 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 resultmia 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 matchmetodo. 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"