2016-08-29 1 views
0

j'ai un tableau de chaînes:Remplacement des caractères non standard dans Ruby

strings = ["\u2014 some text", "\u00A0 Foo", "Bar"] 

Quelle déclaration dois-je écrire afin d'obtenir un tableau qui ressemble à ceci:

strings = [" some text", " Foo", "Bar"] 

J'ai essayé la suite, mais pas de chance:

strings.map!{|string| string.gsub!(/(Wu2014|Wu00A0)/, '')} 
+0

Pourriez-vous définir "non standard", quels caractères doivent être conservés/supprimés? – Stefan

+0

Je veux supprimer tous ces caractères Unicode comme "\ u2014", "\ u00A0" etc. –

+0

Pouvez-vous être plus précis? "B" est aussi un caractère Unicode, alors voulez-vous l'enlever aussi? –

Répondre

1

Si vous souhaitez supprimer les caractères non-ASCII, puis

strings.map{| s | s.encode('ASCII', 'binary', invalid: :replace, undef: :replace, replace: '')} 
+0

Cela supprimera les caractères non-ASCII partout dans la chaîne. J'ai une impression que l'on ne doit enlever que du début de la chaîne. –

-1

Vous avez trop de coups et une expression rationnelle incorrecte

vous pouvez soit essayer

strings.map{|string| string.gsub!(/(\u2014|\u00A0)/, '')} 

ou

strings.map!{|string| string.gsub(/(\u2014|\u00A0)/, '')} 

ou

new_strings = strings.map{|string| string.gsub(/(\u2014|\u00A0)/, '')} 
strings = new_strings 
+1

bien, pour une raison quelconque, regex ne renvoie pas de modèle correspondant ... donc non de vos solutions fonctionne. –

1

je suggère la suppression d'un des détonations. Si vous cherchez à supprimer tous les caractères non ASCII, vous pouvez essayer:

strings.map!{|string| string.gsub(/\P{ASCII}/,'')} 

Cela remplacera tous les caractères non-ASCII avec rien. Pour moi, cela se traduit par:

[" some text", " Foo", "Bar"] 
+0

Cela semble fonctionner, pourriez-vous s'il vous plaît dites-moi comment je fais correspondre UTF-8 s'il vous plaît? –

+0

Cela effacera tous les caractères non-ASCII de la chaîne - est-ce prévu? –

+0

J'ai vérifié le codage de la chaîne, et il retourne UTF-8 –

1

Vous pouvez supprimer tous les caractères non-ASCII depuis le début de la chaîne:

strings = ["\u2014 some text", "\u00A0 Foo", "Bar"] 
strings.map!{|s| s.sub(/\A\P{ASCII}+/,'')} # remove non-ASCII from the start of the string 

Voir la Ruby demo

Ou, vous pouvez supprimer tous les caractères autres que mots et caractères blancs avec

strings.map!{|s| s.sub(/\A[^\w\s]+/,'')} 

Voir this Ruby demo.

Détails:

  • \A - début de la chaîne
  • \P{ASCII} - tout omble chevalier, mais ASCII
  • [^\w\s] - tout caractère mais un mot (\w) ou des espaces (\s) char
  • + - un quantificateur correspondant à une ou plusieurs occurrences du modèle quantifié.
+0

Merci Wiktor, mais je reçois une exception: Encodage :: CompatibilityError: incompatibilité d'encodage regexp match (IBM437 regexp avec la chaîne UTF-8) –

+0

Quelle est la version de Ruby que vous utilisez? Voir http://stackoverflow.com/questions/9857443/ruby-regex-error-incompatible-encoding-regexp-match-ascii-8bit-regexp-with-utf –

+0

Désolé d'entendre la date est sous la météo. –