Comment puis-je extraire une sous-chaîne d'une chaîne dans Ruby?
Exemple:
String1 = "<name> <substring>"
Je veux extraire substring
de String1
(c'est-à-dire tout ce qui se trouve dans la dernière occurrence de <
et >
).
Comment puis-je extraire une sous-chaîne d'une chaîne dans Ruby?
Exemple:
String1 = "<name> <substring>"
Je veux extraire substring
de String1
(c'est-à-dire tout ce qui se trouve dans la dernière occurrence de <
et >
).
Réponses:
String1.scan(/<([^>]*)>/).last.first
scan
crée un tableau qui, pour chaque <item>
in String1
contient le texte entre le <
et le >
dans un tableau à un élément (car lorsqu'il est utilisé avec une expression régulière contenant des groupes de capture, scan crée un tableau contenant les captures pour chaque correspondance). last
vous donne le dernier de ces tableaux et first
vous donne ensuite la chaîne qu'il contient.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
Pas besoin d'utiliser scan
, si nous n'avons besoin que d'un seul résultat.
Pas besoin d'utiliser Python match
, quand on a Ruby String[regexp,#]
.
Voir: http://ruby-doc.org/core/String.html#method-i-5B-5D
Remarque: str[regexp, capture] → new_str or nil
if we need only one result
ma solution. Et match()[]
c'est plus lent, car il s'agit de deux méthodes au lieu d'une.
string[regex]
peut être tout aussi lisible dans ce scénario, c'est donc ce que j'ai utilisé personnellement.
Vous pouvez utiliser une expression régulière pour cela assez facilement…
Permettre des espaces autour du mot (mais ne pas les garder):
str.match(/< ?([^>]+) ?>\Z/)[1]
Ou sans les espaces autorisés:
str.match(/<([^>]+)>\Z/)[1]
<>
doive être le dernier de la chaîne. Si par exemple la chaîne foo <bar> baz
est autorisée (et supposée donner le résultat bar
), cela ne fonctionnera pas.
Voici une approche légèrement plus flexible utilisant la match
méthode. Avec cela, vous pouvez extraire plus d'une chaîne:
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"