web-dev-qa-db-fra.com

Extraire une sous-chaîne d’une chaîne dans Ruby en utilisant une expression régulière

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 >).

111
Madhusudhan
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.

118
sepp2k
"<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

294
Nakilon

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]
21
coreyward

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"
9
Grant Birchmeier

Un scan plus simple serait:

String1.scan(/<(\S+)>/).last
2
Navid