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?


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.


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).


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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.