2010-12-12 19 views
4

Quelqu'un connaît-il une gemme Ruby (ou intégrée, ou syntaxe native, d'ailleurs) qui fonctionne sur les guillemets externes des chaînes?code ruby ​​pour modifier les quotes externes sur les chaînes?

Je me retrouve à écrire des méthodes comme celle-ci, encore et encore:

remove_outer_quotes_if_quoted(myString, chars) -> aString 
add_outer_quotes_unless_quoted(myString, char) -> aString 

Les premiers tests myString pour voir si son début et fin des personnages correspondent à un caractère en chars. Si c'est le cas, il renvoie la chaîne avec des guillemets supprimés. Sinon, il le retourne inchangé. Par défaut, chars correspond à une liste de caractères de guillemets.

La seconde teste myString pour voir si elle commence déjà et se termine par char. Si c'est le cas, il retourne la chaîne inchangée. Si ce n'est pas le cas, il renvoie la chaîne avec char collée avant et après, et toute occurrence incorporée de char est échappée avec une barre oblique inverse. Par défaut, char est le premier d'une liste de caractères par défaut.

(Mes méthodes de main-bricolé n'ont pas des noms verbeux, bien sûr.)

Je l'ai regardé autour des méthodes similaires dans les prises en pension publics mais ne peut pas trouver quelque chose comme ça. Suis-je le seul qui a besoin de faire cela beaucoup? Si non, comment tout le monde fait cela?

+6

Vous pouvez regarder * pourquoi * vous faites cela beaucoup. Une petite analyse des causes profondes peut vous aider à rendre votre code plus propre. –

+1

@ Mark Thomas: Si je pouvais voter votre commentaire plus, je le ferais. Comme il me semble qu'il y a un problème sous-jacent plus profond. – mpd

+0

Heh heh.La cause première est que je travaille avec quelques API différentes, chacune citant les mêmes données légèrement différemment. Je n'ai vraiment aucun contrôle sur eux. – Blue

Répondre

2

Cela pourrait « splain comment enlever et les ajouter:

str1 = %["We're not in Kansas anymore."] 
str2 = %['He said, "Time flies like an arrow, Fruit flies like a banana."'] 

puts str1 
puts str2 

puts 

puts str1.sub(/\A['"]/, '').sub(/['"]\z/, '') 
puts str2.sub(/\A['"]/, '').sub(/['"]\z/, '') 

puts 

str3 = "foo" 
str4 = 'bar' 

[str1, str2, str3, str4].each do |str| 
    puts (str[/\A['"]/] && str[/['"]\z/]) ? str : %Q{"#{str}"} 
end 

Les deux lignes d'origine:

# >> "We're not in Kansas anymore." 
# >> 'He said, "Time flies like an arrow, Fruit flies like a banana."' 

citations dénudage:

# >> We're not in Kansas anymore. 
# >> He said, "Time flies like an arrow, Fruit flies like a banana." 

Ajout des citations en cas de besoin:

# >> "We're not in Kansas anymore." 
# >> 'He said, "Time flies like an arrow, Fruit flies like a banana."' 
# >> "foo" 
# >> "bar" 
+0

Merci pour les suggestions. J'ai écrit moi-même des méthodes (qui traitent de chaînes comme% ['Twas la nuit avant Noël] et% [' This is illogical '], parmi d'autres anomalies) mais je me demandais juste si je réinventais la roue ici. – Blue

4

Si vous le faites beaucoup, vous voudrez peut-être ajouter une méthode à cordes:

class String 
    def strip_quotes 
    gsub(/\A['"]+|['"]+\Z/, "") 
    end 
end 

Ensuite, vous pouvez simplement appeler string.strip_quotes.

Ajout citations est similaire:

class String 
    def add_quotes 
    %Q/"#{strip_quotes}"/ 
    end 
end 

Ceci est appelé comme string.add_quotes et utilise strip_quotes avant d'ajouter des guillemets doubles.

+0

Sachez que le code ci-dessus va potentiellement supprimer les guillemets incompatibles et supprimera plusieurs guillemets de l'une des deux extrémités de la chaîne, car il n'y en a pas. – TJChambers

0

J'utiliserais le value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0]). En bref, ce code simple vérifie si le premier et le dernier char de chaîne sont les mêmes et les supprime s'ils sont simples ou doubles. De plus, autant de types de devis que nécessaire peuvent être ajoutés.

%w["adadasd" 'asdasdasd' 'asdasdasd"].each do |value| 
    puts 'Original value: ' + value 
    value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0]) 
    puts 'Processed value: ' + value 
end 

L'exemple ci-dessus les inscriptions suivantes:

Original value: "adadasd" 
Processed value: adadasd 
Original value: 'asdasdasd' 
Processed value: asdasdasd 
Original value: 'asdasdasd" 
Processed value: 'asdasdasd"