Elegante espressione regolare per abbinare tutte le punteggiature ma non “'” in Emacs Lisp?

StackOverflow https://stackoverflow.com/questions/1894802

  •  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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top