Domanda

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

È stato utile?

Soluzione

È possibile utilizzare un'asserzione anticipata:

(?!999)\d{3}

Questo esempio corrisponde a tre cifre diverse da 999.


Ma se ti capita di non avere un'implementazione di espressioni regolari con questa funzione (vedi Confronto dei sapori delle espressioni regolari ), probabilmente devi creare un'espressione regolare con le funzionalità di base da solo.

Un'espressione regolare compatibile solo con la sintassi di base sarebbe:

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

Questo corrisponde anche a una sequenza di tre cifre diversa da <=>.

Altri suggerimenti

Se si desidera abbinare una parola A in una stringa e non corrispondere a 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 righe di testo che HANNO un cane per un animale domestico e NON ha un gatto puoi usare questa espressione regolare:

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

Troverà solo la seconda riga:

2. I have a pet - dog

Abbina il pattern e usa la lingua host per invertire il risultato booleano della corrispondenza. Questo sarà molto più leggibile e mantenibile.

no, resuscitando questa antica domanda perché aveva una soluzione semplice che non era menzionata. (Hai trovato la tua domanda mentre facevo qualche ricerca per una ricerca di taglie regex .)

  

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

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

Basta ignorare le partite complessive ed esaminare le acquisizioni del Gruppo 1, che conterrà A.

Un esempio (con tutte le dichiarazioni di non responsabilità sull'analisi dell'html in regex): A è cifre, B è cifre entro <a tag

La regex: <a.*?<\/a>|(\d+)

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

Riferimento

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

Come abbinare un pattern a meno che ...

Il complemento di una lingua normale è anche una lingua normale, ma per costruirlo devi costruire la DFA per la lingua normale e trasforma qualsiasi errore valido in uno stato. Vedi questo per un esempio. Ciò che la pagina non dice è che ha convertito /(ac|bd)/ in /(a[^c]?|b[^d]?|[^ab])/. La conversione da un DFA in un'espressione regolare non è banale. È più semplice se puoi utilizzare l'espressione regolare invariata e modificare la semantica nel codice, come suggerito in precedenza.

pattern - re

str.split(/re/g) 

restituirà tutto tranne il modello.

Prova qui

Anche la mia risposta qui potrebbe risolvere il tuo problema:

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

  • Invece di Sostituisci, dovresti usare Abbina.
  • Invece del gruppo $1, dovresti leggere il gruppo $2.
  • Il gruppo Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)"); è stato reso non acquisito lì, cosa che eviterai.

Esempio:

<=>

Il primo gruppo di acquisizione specifica il modello che si desidera evitare. L'ultimo gruppo di acquisizione cattura tutto il resto. Basta leggere quel gruppo, <=>.

(B)|(A)

quindi utilizza il gruppo 2 acquisisce ...

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