2010-07-19 7 views
36

Ho cercato dappertutto nella documentazione emacs lisp per come cercare le espressioni regolari in una stringa. Tutto quello che trovo è come farlo nei buffer.elisp regexp cerca nelle stringhe, non nel buffer

C'è qualcosa che mi manca? Dovrei semplicemente sputare la mia stringa in un buffer temporaneo e cercarla lì? È solo lo stile di codifica dell'elis, a cui mi abituerò? C'è una soluzione standard a questo problema. Manipolare i buffer sembra cludgy quando dovrei essere in grado di cercare direttamente in una variabile già presente.

risposta

25

Here is a discussion of string content vs buffer content in the Emacs wiki. Basta memorizzare la stringa come variabile.

La cosa delicata about strings è che generalmente non si modifica la stringa stessa (tranne se si eseguono funzioni di array su stringa, poiché una stringa è un array, ma in genere dovrebbe essere evitata), ma si restituisce la stringa modificata.

In ogni caso, ecco un esempio di utilizzo di una stringa in elisp.

Questo taglierà gli spazi a partire dalla fine di una stringa:

(setq test-str "abcdefg ") 
(when (string-match "[ \t]*$" test-str) 
    (message (concat "[" (replace-match "" nil nil test-str) "]"))) 
11

La funzione che stai cercando è string-match. Se è necessario eseguire ripetutamente la corrispondenza, utilizzare l'indice che restituisce come parametro "start" facoltativo per la chiamata successiva. La documentazione è nel manuale ELisp, capitolo "Ricerca di espressioni regolari".

3

Per sostituire ogni corrispondenza di espressioni regolari in una stringa, dare un'occhiata a replace-regexp-in-string.

1

Per cercare l'inizio di una stringa di

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

Per cercare la fine di una stringa

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