Regex come abbinare un personaggio opzionale


147

Ho una regex che pensavo funzionasse correttamente fino ad ora. Devo abbinare un personaggio opzionale. Potrebbe essere lì o no.

Ecco due stringhe. La stringa superiore è abbinata mentre quella inferiore no. L'assenza di una singola lettera nella stringa inferiore è ciò che la sta facendo fallire.

Vorrei ricevere la lettera singola dopo le 5 cifre iniziali se è presente e, in caso contrario, continuare a ottenere il resto della stringa. Questa lettera può essereA-Z .

Se rimuovo ([A-Z]{1}) +.*? +dal regex, corrisponderà a tutto ciò di cui ho bisogno tranne la lettera ma è un po 'importante.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Ecco la regex che sto usando.

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

Risposte:


247

Uso

[A-Z]?

per rendere facoltativa la lettera. {1}è ridondante. (Ovviamente potresti anche scrivere [A-Z]{0,1}che significherebbe lo stesso, ma è per questo che ?c'è.)

Potresti migliorare la tua regex a

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

E, poiché nella maggior parte dei dialetti regex, \dè lo stesso di [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

Ma: hai davvero bisogno di 11 gruppi di acquisizione separati? E se è così, perché non catturi il quarto-ultimo gruppo di cifre?


Tim, onestamente non sono sicuro perché non ho scritto questa regex. Sono ancora abbastanza nuovo su regex. Se vedi un modo migliore di scrivere questo, sono aperto ai suggerimenti.
jim

1
Tim, il tuo esempio funziona per entrambe le stringhe, sia che io abbia una lettera in quella posizione oppure no. Grazie.
jim

26

Puoi rendere facoltativa la singola lettera aggiungendola ?dopo:

([A-Z]{1}?)

Il quantificatore {1}è ridondante, quindi è possibile rilasciarlo.


Grazie codeaddict. Il punto interrogativo prende il posto del `+. *? + `?
jim

Quando si utilizza grep regex si otterrà un errore se si elimina {1} (grep: l'asserzione lookbehind non è fissa). Quindi è un caso per lasciarlo.
Zunderscore,

6

Devi contrassegnare anche la singola lettera come facoltativa:

([A-Z]{1})? +.*? +

o rendere l'intera parte facoltativa

(([A-Z]{1}) +.*? +)?

1
Stefan, vorrei rendere la lettera del tutto facoltativa. Ho provato entrambi, ma non corrisponde ancora a nulla. Sono sicuro di aver sbagliato. Potresti modificare il tuo esempio per includerlo nella stringa?
jim

0

Puoi anche usare regex più semplice progettato per il tuo caso come (.*)\/(([^\?\n\r])*)dove $2corrisponde a quello che vuoi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.