búsqueda regexp de elisp en cadenas, no en buffers
string emacs (4)
He estado buscando en todas partes en la documentación de emacs lisp cómo buscar expresiones regulares en una cadena. Todo lo que encuentro es cómo hacer esto en los buffers.
¿Se me escapa algo? ¿Debo simplemente escupir mi cuerda en un buffer temporal y buscarla allí? ¿Es este el estilo de codificación de elisp, algo a lo que me acostumbraré? ¿Hay una solución estándar para este problema? La manipulación de almacenamientos intermedios parece poco clara cuando debería ser capaz de buscar directamente en una variable ya presente.
La función que estás buscando es string-match
. Si necesita repetir el emparejamiento, use el índice que devuelve como el parámetro opcional de "inicio" para la próxima llamada. La documentación se encuentra en el manual de ELisp, capítulo "Búsqueda de expresiones regulares".
Para buscar el comienzo de una cadena
(defun string-starts-with-p (string prefix)
"Return t if STRING starts with PREFIX."
(and
(string-match (rx-to-string `(: bos ,prefix) t)
string)
t))
Para buscar el final de una cadena
(defun string-ends-with-p (string suffix)
"Return t if STRING ends with SUFFIX."
(and (string-match (rx-to-string `(: ,suffix eos) t)
string)
t))
Para reemplazar cada coincidencia de expresiones regulares en una cadena, eche un vistazo a replace-regexp-in-string
.
Aquí hay una discusión del contenido de la secuencia versus el contenido del búfer en la wiki de Emacs. Simplemente almacene su cadena como una variable.
Lo difícil de las cadenas es que generalmente no se modifica la cadena en sí (excepto si se realizan funciones de matriz en cadena, ya que una cadena es una matriz, pero esto generalmente se debe evitar), pero se devuelve la cadena modificada.
En cualquier caso, aquí hay un ejemplo de usar una cadena en elisp.
Esto recortará el espacio en blanco desde el final de una cadena:
(setq test-str "abcdefg ")
(when (string-match "[ /t]*$" test-str)
(message (concat "[" (replace-match "" nil nil test-str) "]")))