String-Gleichheit, Groß- / Kleinschreibung ignorieren?

8

F: Wie testet man die Gleichheit von Zeichenfolgen, ignoriert aber die Groß- und Kleinschreibung?

Ich habe eine Situation, in der ich Zeichenfolgen vergleichen möchte, aber Groß- und Kleinschreibung ignorieren möchte. Der Fall ist wichtig für string-equalund anscheinend unempfindlich gegenüber case-fold-search:

(string-equal "string" "StrinG")        ; => nil
(let ((case-fold-search t))
  (string-equal "string" "StrinG"))     ; => nil

Ich könnte die Zeichenfolgen immer vorverarbeiten (z. B. mit downcase), bevor ich sie vergleiche:

(string-equal (downcase "string")
              (downcase "StrinG"))      ; => t

Aber das scheint übertrieben, wenn man jedes Mal zwei zusätzliche Funktionsaufrufe ausführt. Habe ich irgendwo die relevante Prädikatfunktion übersehen?

Dan
quelle
Ich habe Vergleichszeichenfolgen verwendet und das folgende Problem festgestellt. (setq str "title") (cond (compare-strings str "authortitle") etwas tun.) (compare-strings str "title") etwas anderes tun.) Die ersten Vergleichszeichenfolgen geben einen positiven Wert zurück, der true impliziert, was nicht der Fall ist was ich möchte. Deshalb habe ich den Downcase-Vorschlag verwendet.

Antworten:

7

Sie können verwenden compare-strings:

(compare-strings STR1 START1 END1 STR2 START2 END2 &optional IGNORE-CASE)

Verwenden Sie nils für Start und Ende, um die gesamten Zeichenfolgen zu verwenden.

Choroba
quelle
Vielen Dank; Ich hatte das gesehen, aber nicht bemerkt, dass man nils verwenden kann, wie Sie erwähnt haben. Ich werde die Frage etwas länger offen lassen, falls es eine andere Option gibt, die keine 4 zusätzlichen nils in einem Funktionsaufruf erfordert .
Dan
5

Verwendung string-suffix-p:

(string-suffix-p "string" "strinG" t)

Viel einfacher und benötigt keine 4 nils. Es wird nicht getestet, ob Zeichenfolgen per se gleich sind ( (string-suffix-p "word" "buzzword" t) ⇒ t). In einigen Fällen sollte dies jedoch ausreichen (wenn Sie nur ein begrenztes Wörterbuch zur Überprüfung haben).

rgtk
quelle
2
(string-suffix-p "strinG" "this string" t)kehrt auch zurück t. Dies ist nicht das, was das OP will. Ich schlage vor, dass Sie diese Antwort entweder ändern oder löschen.
Tobias
Antwort aktualisiert. Ich werde es verlassen, weil string-{prefix,suffix}-pes in vielerlei Hinsicht nützlich sein kann: Testen Sie, ob das Wort am Punkt Tastatur ist (in SQL zum Beispiel, wo Groß- und Kleinschreibung gemischt werden kann) usw.
rgtk
3

Eine weitere kurze Alternative:

(equalp "string" "strinG")      ; => t
(equalp "strinG" "this string") ; => nil 
(equalp "word" "buzzword")      ; => nil

equalpist die Abkürzung für cl-equalp; von (documentation 'equalp):

wie 'gleich', außer dass es numerisch gleiche Anzahlen verschiedener Typen (float vs. integer) akzeptiert und Zeichenfolgen auch ohne Berücksichtigung der Groß- und Kleinschreibung vergleicht .

Dardisco
quelle