2010-08-05 10 views
0

J'essaie de trouver une expression rationnelle pour supprimer tous les caractères spéciaux sauf certains. Par exemple, j'ai une chaîne:Supprimer tous les caractères spéciaux sauf

str = "subscripción gustaría♥" 

Je veux que la sortie soit "subscripción gustaría".

La façon dont j'ai essayé de faire est de faire correspondre tout ce qui n'est pas un caractère ascii (00 - 7F) et pas le caractère spécial que je veux et le remplacer par un blanc.

str.gsub(/(=?[^\x00-\x7F])(=?^\xC3\xB3)(=?^\xC3\xA1)/,'') 

Cela ne fonctionne pas. Le dernier caractère spécial n'est pas supprimé.

Quelqu'un peut-il aider? (Ceci est rubis 1.8)

Mise à jour: J'essaie de rendre la question un peu plus claire. La chaîne est encodée en utf-8. Et j'essaie de mettre en liste blanche les caractères ascii plus ó et í et de tout mettre en liste noire.

Répondre

1
str.split('').find_all {|c| (0x00..0x7f).include? c.ord }.join('') 
+0

Non, cela a supprimé tous les caractères spéciaux.Je veux seulement ♥ être enlevé et non ó et í – maheshmurthy

1

La question est un peu vague. Il n'y a pas un mot sur le codage de la chaîne. En outre, vous voulez des caractères blancs ou une liste noire? Lesquels? Mais vous avez l'idée, décidez de ce que vous voulez, et ensuite utilisez les plages appropriées en tant que collègues ici déjà proposées. Quelques exemples: si str = "subscripción gustaría ♥" est utf-8 alors vous pouvez la liste noire tous les ombles dessus de la gamme (sauf): espaces.

 str.gsub(/[^\x{0021}-\x{017E}\s]/,'') 

si la chaîne est en codepage ISO-8859-1 vous peut essayer de faire correspondre tous les personnages excentriques comme le « cœur » depuis le début de la plage ASCII:

str.gsub(/[\x01-\x1F]/,'') 

le problème est ici avec regex, n'a rien à voir avec Ruby. Vous aurez probablement besoin d'expérimenter plus.

+0

Ouais, mon mauvais, j'aurais dû le mentionner est encodé en utf-8. Je vois ce que tu veux dire. J'essaie de mettre en liste blanche seulement 6 caractères spéciaux. Donc, ce que j'essaie d'obtenir est "si ce n'est pas dans la plage 00-7F et pas \ xC3 \ xB3 et pas \ xC3 \ xA1", puis le remplacer par vide. Je reçois une erreur de syntaxe lorsque j'ai essayé votre solution ci-dessus. Il n'aime pas les accolades. – maheshmurthy

+1

La liste noire est une mauvaise idée. Qui sait ce qui pourrait être là-bas. Vous feriez mieux de dire exactement ce que vous accepterez, de cette façon, il n'y a pas de surprises. –

+0

Oui ma mauvaise aussi, je pensais en PHP, donc désolé pour ma mauvaise regex. Regardez la réponse de Mark Wilkins, je l'ai testé et cela a fonctionné dans cet exemple. – Ernest

0

Les caractères que vous souhaitez conserver et que vous souhaitez supprimer ne sont pas complètement définis. Le caractère de la chaîne de l'exemple est un caractère Unicode qui, dans mon navigateur, s'affiche sous la forme d'un symbole de cœur. Mais il semble que vous ayez affaire à des caractères ASCII 8 bits (puisque vous utilisez ruby ​​1.8 et vos expressions régulières pointent de cette façon). Néanmoins, vous devriez être capable de le faire de l'une des deux manières suivantes; soit spécifiez les caractères que vous souhaitez conserver, soit spécifiez les caractères que vous souhaitez supprimer. Par exemple, ce qui suit précise que tous les caractères doivent être conservés 0x00-0x7F et 0xC0-0xF6 (supprimer tout ce qui est pas dans ce groupe):

puts str.gsub(/[^\x00-\x7F\xC0-\xF6]/,'') 

Cet exemple suivant spécifie que les caractères 0xA1 et 0xC3 devraient être supprimés.

puts str.gsub(/[\xA1\xC3]/,'') 
2

Oniguruma prend en charge tous les caractères qui vous intéressent sans avoir à traiter de points de code. Vous pouvez simplement ajouter les caractères Unicode dans la classe de caractères que vous êtes en liste blanche, suivi de l'option 'u'.

ruby-1.8.7-p248 > str = "subscripción gustaría♥" 
=> "subscripci\303\263n gustar\303\255a\342\231\245" 
ruby-1.8.7-p248 > puts str.gsub(/[^a-zA-Z\sáéíóúÁÉÍÓÚ]/u,'') 
subscripción gustaría 
=> nil 
0

Je fini par faire ceci: str.gsub (/ [^ \ x00- \ x7FÁáÉéÍíÑñÓóÚúÜü] /, ''). Cela ne marche pas sur mon mac mais fonctionne sur linux.

+0

Ensuite, vous devriez vérifier ma réponse, cela fonctionne sur mon Mac et ne correspond pas aux octets, ce qui pourrait mal se passer pour vous. –

Questions connexes