Comment puis-je extraire une sous-chaîne d'une chaîne en Ruby?
Exemple:
String1 = "<name> <substring>"
Je veux extraire substring
de String1
(c'est-à-dire tout dans la dernière occurrence de <
et >
).
String1.scan(/<([^>]*)>/).last.first
scan
crée un tableau qui, pour chaque <item>
dans String1
contient le texte entre le <
et le >
dans un tableau à un élément (car lorsqu'il est utilisé avec une expression rationnelle 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 la chaîne qu'il contient.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
Pas besoin d'utiliser scan
, si un seul résultat est nécessaire.
Nul besoin d’utiliser match
, quand on a String[regexp,#]
.
Voir: http://Ruby-doc.org/core/String.html#method-i-5B-5D
Remarque: str[regexp, capture] → new_str or nil
Vous pouvez utiliser une expression régulière pour cela assez facilement…
Permettre des espaces autour de la Parole (sans les garder):
str.match(/< ?([^>]+) ?>\Z/)[1]
Ou sans les espaces autorisés:
str.match(/<([^>]+)>\Z/)[1]
Voici une approche légèrement plus souple utilisant la méthode match
. 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"
Un scan plus simple serait:
String1.scan(/<(\S+)>/).last