¿Cómo puedo extraer una subcadena de una cadena en Ruby?
Ejemplo:
String1 = "<name> <substring>"
Quiero extraer substring
de String1
(es decir, todo dentro de la última aparición de <
y >
).
¿Cómo puedo extraer una subcadena de una cadena en Ruby?
Ejemplo:
String1 = "<name> <substring>"
Quiero extraer substring
de String1
(es decir, todo dentro de la última aparición de <
y >
).
Respuestas:
String1.scan(/<([^>]*)>/).last.first
scan
crea una matriz que, para cada <item>
en String1
contiene el texto entre el <
y el >
en una matriz de una elemento (porque cuando se utiliza con una expresión regular que contiene grupos de captura, exploración crea una matriz que contiene las capturas para cada partido). last
le da la última de esas matrices y first
luego le da la cadena que contiene.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
No es necesario usar scan
, si solo necesitamos un resultado.
No es necesario usar Python match
, cuando tenemos Ruby String[regexp,#]
.
Ver: 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
mi solución. Y match()[]
es más lento, porque son dos métodos en lugar de uno.
string[regex]
puede ser tan legible en este escenario, así que eso es lo que usé personalmente.
Puedes usar una expresión regular para eso con bastante facilidad ...
Permitir espacios alrededor de la palabra (pero no mantenerlos):
str.match(/< ?([^>]+) ?>\Z/)[1]
O sin los espacios permitidos:
str.match(/<([^>]+)>\Z/)[1]
<>
realmente deba ser lo último en la cadena. Si, por ejemplo, la cadena foo <bar> baz
está permitida (y se supone que da el resultado bar
), esto no funcionará.
Aquí hay un enfoque un poco más flexible usando el match
método. Con esto, puede extraer más de una cadena:
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"