Elegante espressione regolare per abbinare tutte le punteggiature ma non “'” in Emacs Lisp?
-
19-09-2019 - |
Domanda
Voglio abbinare tutte le punteggiature, ma non "'
", come in "I'm
". Per esempio, nella frase di seguito:
I'm a student, but I'm also working.
^not match ^match ^not ^match
posso usare "[[:punct:]]+
" per soddisfare tutte le punteggiature, ma sto avendo difficoltà di escludere "'
" dal pattern matching.
Naturalmente, potrei usare someting come la seguente di esprimere per enumerazione, ma è molto noioso, soprattutto se si considera tutti quei segni di interpunzione per il cinese pure.
"[,.?!]
"
Si prega di suggerire una soluzione più elegante.
Grazie in anticipo,
Yu
Soluzione 2
Grazie alla risposta di Bart e tutti i tuoi commenti. Ispirato da Bart, ho controllato che Emacs sembra ancora non ancora sostenere look-ahead. Ma nello spirito, ho codificato il seguente:
(defun stringa di match-ma-escludere (stringa regexp esclusione & Start opzionale)
"Return index di inizio della prima partita per regexp nella stringa, o nullo,
ma esclude l'espresso regolare l'esclusione.
Corrispondenza ignora caso se case-fold-search' is non-nil.
If third arg start is non-nil, start search at that index in string.
For index of first char beyond the match, do (match-end 0).
match-end 'e `match-inizio' anche dare indici di sottostringhe
accompagnato da costrutti parentesi nel modello.
È possibile utilizzare la funzione di `match-string' per estrarre i sottostringhe di pari passo con le costruzioni parentesi nella espressione regolare ".
(let ((dati nil))
(and (string-match regexp string start)
;; keep the match-data for recovery at the end.
(setq data (match-data))
(not (string-match (concat "[" exclusion "]") (match-string 0 string)))
(progn (set-match-data data) t) ; To recover the match data, and make sure it produces t as returned value
(match-beginning 0)
))
)
Quindi, per l'espressione equivalente di '[[: punct:]] string (?!) "'")
sarebbe
(string match-ma-esclusione "[[: punct:]]" stringa "'")
Questo sarebbe fare il lavoro, ma non elegante. Dovrebbe essere una piccola aggiunta di emacs per rendere questo un supporto built-in.
emacs sono supportate classe di caratteri ora.
Grazie di nuovo.
Yu
Altri suggerimenti
Se il sapore regex supporta look-around, si potrebbe fare questo:
(?!')[[:punct:]]
In parole povere:. se non c'è apostrofo quando si guarda avanti, adattarsi a qualsiasi segno di punteggiatura