Errore Regex .NET: intervallo in ordine inverso

Sto creando un Regex e finora l’ho fatto e provato,

^([0][1-9]|1[0-2])[/-.] 

e ottengo il seguente errore.

  parsing "^([0][1-9]|1[0-2])[/-.]" - [xy] range in reverse order. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.ArgumentException: parsing "^([0][1-9]|1[0-2])[/-.]" - [xy] range in reverse order. 

Dopo aver fatto un po ‘di casino e cercando di trovare un errore nella mia espressione regolare, ho semplicemente cambiato regex con

  ([0][1-9]|1[0-2])[-/.] so basically only changed this [/-.] to [-/.] 

e ha funzionato.

Poi ho provato alcune altre combinazioni che hanno funzionato.

  [/-] [/.] [/.-] [/-?] 

Poi ho provato alcuni altri che non funzionavano.

  [/-\*] [/-\+] 

Quindi apparentemente “-” ha problemi in alcuni punti ma nessun problema agli altri. È un bug? Oppure mi sfugge qualcosa?

Aggiornare

Grazie ragazzi per aver sottolineato che “-” è assunto come intervallo se è nel mezzo o non è sfuggito da “\”.

Tuttavia, perché ha funzionato per [/ -?] O [/ – \?], È davvero la gamma di definizione qui o prenderlo alla lettera?

Non un bug All’interno di una class di caratteri (denotata da […] ) il carattere - deve essere il primo (alcuni sapori consentono il primo o l’ultimo, credo) se deve essere incluso come letterale. Altrimenti ci si aspetta che denoti un intervallo, come 0-9 o AZ o anche /-. .

Il problema è che secondo ASCII (o Unicode?), Il . viene prima del / , quindi l’intervallo viene interpretato come arretrato, equivalente a specificare un intervallo 7-4 .

Se hai usato [.-/] , non mi aspetto un’eccezione di analisi, ma non otterrai i risultati che ti aspettavi.

Il problema è con questa parte:

 [/-.] 

Ciò significa “l’intervallo di caratteri da” / “a”. “” – ma “/” viene dopo “.” in Unicode, quindi l’intervallo non ha senso.

Se vuoi che significhi “barra, trattino o punto”, allora vuoi:

 [/\-.] 

… in altre parole, devi sfuggire al trattino. Nota che se questo è in una normale stringa C #, devi anche eseguire un altro livello di escape:

 string pattern = "[/\\-.]"; 

L’utilizzo di una stringa letterale letterale significa che non è necessario sfuggire alla barra rovesciata:

 string pattern = @"[/\-.]"; 

In alternativa, come suggerito da Jay, puoi semplicemente mettere il trattino all’inizio:

 [-/.] 

o fine:

 [/.-] 

(Ho appena provato, e tutte e tre queste opzioni funzionano.)

All’interno di una class di caratteri vale a dire [] il - denota un intervallo, cioè tutte le lettere minuscole tra a e z possono essere espresse come [az] .

Quali sono gli intervalli per [/-.] ?

Ho anche avuto questo messaggio di errore, ma con alcuni argomenti diversi. Fortunatamente, erano solo gli argomenti nel modo sbagliato 🤦.