web-dev-qa-db-fra.com

Comment couper des caractères spécifiques d'une chaîne en Ruby?

J'ai plusieurs chaînes qui ressemblent à ceci:

"((String1))"

Ils sont tous de longueurs différentes. Comment pourrais-je supprimer les parenthèses de toutes ces chaînes dans une boucle?

70
Cristiano

Faites comme ci-dessous en utilisant String#tr :

_ "((String1))".tr('()', '')
 # => "String1"
_
145
Arup Rakshit

Si vous souhaitez simplement supprimer les deux premiers caractères et les deux derniers, vous pouvez utiliser index négatifs sur la chaîne:

s = "((String1))"
s = s[2...-2]
p s # => "String1"

Si vous souhaitez supprimer toutes les parenthèses de la chaîne, vous pouvez utiliser la méthode delete sur la classe string:

s = "((String1))"
s.delete! '()'
p s #  => "String1"
35
jbr

Utilisation de String#gsub avec une expression régulière:

_"((String1))".gsub(/^\(+|\)+$/, '')
# => "String1"
"(((((( parentheses )))".gsub(/^\(+|\)+$/, '')
# => " parentheses "
_

Cela supprimera uniquement les parenthèses environnantes.

_"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '')
# => " This (is) string "
_
17
falsetru

Pour ceux qui découvrent cela et recherchent des performances, il semble que #delete et #tr aient à peu près la même vitesse et 2 à 4 fois plus vite que gsub.

text = "Here is a string with / some forwa/rd slashes"
tr = Benchmark.measure { 10000.times { text.tr('/', '') } }
# tr.total => 0.01
delete = Benchmark.measure { 10000.times { text.delete('/') } }
# delete.total => 0.01
gsub = Benchmark.measure { 10000.times { text.gsub('/', '') } }
# gsub.total => 0.02 - 0.04
14
daino3

Voici un moyen encore plus court d'y parvenir:

1) en utilisant Negative character class pattern matching

irb(main)> "((String1))"[/[^()]+/]
=> "String1"

^ - Correspond à tout ce qui n'est PAS dans la classe de caractères. Dans la classe charachter, nous avons ( et )

Ou avec une substitution globale "AKA: gsub" comme d'autres l'ont mentionné.

irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"
1
zee