Regex – come abbinare tutto tranne uno schema particolare

Come scrivo un’espressione regolare per abbinare qualsiasi stringa che non soddisfa un particolare schema? Sono di fronte a una situazione in cui devo abbinare un modello (A e ~ B).

Potresti usare un’asserzione di previsione:

(?!999)\d{3} 

Questo esempio corrisponde a tre cifre diverse da 999 .


Tuttavia, se non si dispone di un’implementazione di espressioni regolari con questa funzione (vedere Confronto tra i sapori delle espressioni regolari ), è probabile che sia necessario creare un’espressione regolare con le funzionalità di base.

Un’espressione regolare compatibile con syntax di base solo sarebbe:

 [0-8]\d\d|\d[0-8]\d|\d\d[0-8] 

Ciò corrisponde anche a qualsiasi sequenza di tre cifre che non sia 999 .

Se vuoi abbinare una parola A in una stringa e non far corrispondere una parola B. Ad esempio: Se hai un testo:

 1. I have a two pets - dog and a cat 2. I have a pet - dog 

Se vuoi cercare delle righe di testo che hanno un cane per un animale domestico e NON ha gatto puoi usare questa espressione regolare:

 ^(?=.*?\bdog\b)((?!cat).)*$ 

Troverà solo la seconda linea:

 2. I have a pet - dog 

Abbina lo schema e usa la lingua dell’host per invertire il risultato booleano della partita. Questo sarà molto più leggibile e mantenibile.

Non notoriamente, risuscitando questa antica domanda perché aveva una soluzione semplice che non era menzionata. (Hai trovato la tua domanda mentre facevi qualche ricerca per una ricerca sulla generosità regex .)

Sono di fronte a una situazione in cui devo abbinare un modello (A e ~ B).

La regex di base per questo è spaventosamente semplice: B|(A)

Devi semplicemente ignorare le partite generali ed esaminare le acquisizioni del Gruppo 1, che conterranno A.

Un esempio (con tutte le dichiarazioni di non responsabilità sull’analisi di html nella regex): A è cifre, B è cifre all’interno di

La regex: |(\d+)

Demo (guarda il gruppo 1 nel riquadro in basso a destra)

Riferimento

Come abbinare il modello tranne nelle situazioni s1, s2, s3

Come abbinare un modello a meno che ...

Il complemento di una lingua normale è anche un linguaggio normale, ma per costruirlo devi build il DFA per la lingua normale e trasformare qualsiasi modifica di stato valida in un errore. Vedi questo per un esempio. Quello che la pagina non dice è che ha convertito /(ac|bd)/ into /(a[^c]?|b[^d]?|[^ab])/ . La conversione da un DFA a un’espressione regolare non è banale. È più facile se puoi usare l’espressione regolare immutata e cambiare la semantica nel codice, come suggerito in precedenza.

modello – re

 str.split(/re/g) 

restituirà tutto tranne il modello.

Prova qui

La mia risposta qui potrebbe risolvere anche il tuo problema:

https://stackoverflow.com/a/27967674/543814

  • Invece di Sostituisci, dovresti usare Abbina.
  • Invece del gruppo $1 , leggerebbe il gruppo $2 .
  • Il gruppo $2 stato reso non-catturante lì, che eviterai.

Esempio:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

Il primo gruppo di cattura specifica il modello che si desidera evitare. L’ultimo gruppo catturante cattura tutto il resto. Basta leggere quel gruppo, $2 .

 (B)|(A) 

quindi usa quale gruppo 2 cattura …