Cadena de igualdad, ignorar mayúsculas y minúsculas?

8

P: ¿cómo se prueba la igualdad de cadena pero se ignora el caso?

Tengo una situación en la que me gustaría comparar cadenas pero ignorar mayúsculas y minúsculas. El caso es significativo para string-equal, y aparentemente es insensible a case-fold-search:

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

Siempre podría preprocesar las cadenas (por ejemplo, con downcase) antes de compararlas:

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

Pero eso parece excesivo hacer dos llamadas de funciones adicionales cada vez. ¿He pasado por alto la función de predicado relevante en alguna parte?

Dan
fuente
Utilicé cadenas de comparación y encontré el siguiente problema. (setq str "title") (cond (compare-strings str "authortitle") hace algo.) (compare-strings str "title") hace otra cosa.) La primera cadena de comparación devuelve un valor positivo que implica verdadero que no es lo que quiero. Por lo tanto, utilicé la sugerencia de minúsculas.

Respuestas:

7

Puedes usar compare-strings:

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

Use nils para comenzar y terminar para usar las cadenas completas.

choroba
fuente
Gracias; Lo había visto pero no me di cuenta de que uno podría usar nils como mencionaste. Dejaré la pregunta abierta un poco más en caso de que haya otra opción que no requiera 4 nils adicionales en una llamada de función.
Dan
5

Uso string-suffix-p:

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

Mucho más simple y no requiere 4 nils. No prueba si las cadenas son iguales per se ( (string-suffix-p "word" "buzzword" t) ⇒ t). Aunque, en algunos casos, esto debería ser suficiente (si tiene un diccionario limitado para verificar).

rgtk
fuente
2
(string-suffix-p "strinG" "this string" t)También vuelve t. Esto no es lo que quiere el OP. Le sugiero que modifique o elimine esta respuesta.
Tobias
Respuesta actualizada Lo dejaré porque string-{prefix,suffix}-ppuede ser útil de muchas maneras: pruebe si la palabra en el punto tiene teclado (en SQL, por ejemplo, dónde se pueden mezclar mayúsculas y minúsculas), etc.
rgtk
3

Otra alternativa corta:

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

equalpes la abreviatura de cl-equalp; de (documentation 'equalp):

como 'igual', excepto que acepta números numéricamente iguales de diferentes tipos (flotante versus entero), y también compara cadenas que no distinguen entre mayúsculas y minúsculas .

Dardisco
fuente