2010-12-12 12 views
4

Kennt jemand ein Ruby-Juwel (oder eine eingebaute oder native Syntax), die auf den äußeren Anführungszeichen von Strings operiert?Ruby-Code zum Ändern der äußeren Anführungszeichen in Strings?

finde ich mir Methoden wie das Schreiben immer und immer wieder:

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

Die ersten Tests myString zu sehen, ob sein Anfang und das Ende Zeichen in chars ein beliebiges Zeichen entsprechen. Wenn dies der Fall ist, wird die Zeichenfolge mit entfernten Anführungszeichen zurückgegeben. Andernfalls wird es unverändert zurückgegeben. chars wird standardmäßig auf eine Liste von Anführungszeichen gesetzt.

Der zweite Test myString zu sehen, ob es bereits beginnt und endet mit char. Ist dies der Fall, wird die Zeichenfolge unverändert zurückgegeben. Ist dies nicht der Fall, wird die Zeichenkette mit char zurück und vor und nach dem Einfügen ausgegeben, und ein eingebettetes Vorkommen von char wird mit Backslash versehen. char ist standardmäßig der erste in einer Standardliste von Zeichen.

(My Hand gepflasterten Methoden haben keine so ausführliche Namen, natürlich.)

Ich habe um in der öffentlichen repos nach ähnlichen Methoden gesucht, aber nicht so etwas finden. Bin ich der Einzige, der das viel machen muss? Wenn nicht, wie machen das alle anderen?

+6

Vielleicht möchten Sie sehen * warum * Sie dies tun viel. Eine kleine Ursachenanalyse hilft Ihnen, Ihren Code sauberer zu gestalten. –

+1

@Mark Thomas: Wenn ich deinen Kommentar mehr abstimmen könnte, würde ich. Da es mir scheint, gibt es ein tiefer liegendes Problem. – mpd

+0

Heh heh.Der Grund dafür ist, dass ich mit ein paar verschiedenen APIs arbeite, von denen jede die gleichen Daten etwas anders zitiert. Ich habe wirklich keine Kontrolle über sie. – Blue

Antwort

2

Dies könnte ‚splain wie entfernen und fügen Sie sie:

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 

Die ursprünglichen zwei Linien:

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

Stripping Zitate:

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

Zitate Hinzufügen bei Bedarf:

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

Danke für die Vorschläge. Ich habe eigene Methoden geschrieben (die sich mit Strings wie% ['tas the night before Christmas] und% [' Das ist unlogisch]], neben anderen Anomalien) beschäftigen müssen, aber ich habe mich nur gefragt, ob ich das Rad hier neu erfunden habe. – Blue

4

Wenn Sie es eine Menge zu tun, können Sie eine Methode String hinzufügen möchten:

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

Dann können Sie einfach string.strip_quotes nennen.

Zitate Hinzufügen ähnelt:

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

Dies als string.add_quotes genannt wird, und verwendet strip_quotes vor doppelte Anführungszeichen hinzufügen.

+0

Beachten Sie, dass der obige Code möglicherweise nicht übereinstimmende Anführungszeichen streicht und mehrere Anführungszeichen von beiden Enden der Zeichenfolge löscht, wenn es welche gibt. Es ist egal, ob beide "oder" sind, sie streichen sie nur. – TJChambers

0

Ich würde die value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0]) verwenden. Kurz gesagt, dieser einfache Code prüft, ob das erste und das letzte Zeichen einer Zeichenfolge gleich sind und entfernt sie, wenn sie ein einzelnes/doppeltes Anführungszeichen sind. Zusätzlich können so viele benötigte Anführungszeichen hinzugefügt werden.

%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 

Das obige Beispiel folgendes drucken:

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