2015-09-29 16 views
6

Sto provando a limitare le voci a un formato specifico.Espressione regolare condizionale Javascript if-then-else

Se la voce è 5500 o 5100, come 01 \ 01-5500-000-00 poi voglio avere questo:

^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-$ 

Ma se la voce ha qualcosa di diverso da 5500 o 5100 voglio avere questo:

^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}$ 

Come può essere realizzato con l'if if else else?

+4

Che lingua stai usando? Che cosa hai provato? – Sam

+0

'^ [0-9] {2,} \\ [0-9] {2} -5 [15] 00- [0-9] {3} - $ |^[0-9] {2,} \\ [0-9] {2} - (?! 5 [15] 00) [0-9] {4} - [0-9] {3} - [0-9] {2} $ ' –

+0

I Ho usato http://www.webtoolkitonline.com/regular-expression-tester.html per aiutarmi a creare correttamente l'espressione. E ho provato a usare la pipe con 5500 tra parentesi come questa: (? =. * 5500) |^[0-9] {2,} \\ [0-9] {2} \ - [0-9] {4} \ - [0-9] {3} \ - [0-9] {2} $ - non corretto – user974061

risposta

7

sintassi regex condizionale non è supportato da motore regex JavaScript, ma può essere risolto con un gruppo non-catturante contenente 2 alternative:

  1. Uno con il look-ahead positivo e

  2. Il secondo con l'anteprima inversa inversa.

Questa espressione regolare corrisponde ai tuoi criteri ed è compatibile con JavaScript:

^(?:(?=.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-|(?!.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2})$ 

Vedi regex demo

Mi permetta di scomposizione:

  • ^ - Inizio della stringa
  • (?:
    • (?=.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\- - prima alternativa con il (?=.*\b5[15]00\b) look-ahead che richiede un intera parola 5500 o 5100 all'interno della stringa, e il primo modello si dispone
    • | - alternanza operatore
    • (?!.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}) - seconda alternativa è preceduto dalla previsione negativa (?!.*\b5[15]00\b) che assicura che non ci sia 5100 o 5500 all'interno della stringa e che corrisponda solo al secondo modello.
  • $ - fine stringa.
1

Usa condizionali, ad esempio:

((= regex) allora | altro??): [0-9]{2,}\\[0-9]{2}\-(?(?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-[0-9]{3}\-[0-9]{2})

Regex condizionali esempio: [email protected]

Nel caso in cui si sta utilizzando un motore regex non basato su PCRE, è possibile essere in grado di simulare la funzionalità effettuando le seguenti operazioni:

((?=positive-regex-statement)then|(?!negavite-regex-statement)then) 

Es.

^[0-9]{2,}\\[0-9]{2}\-((?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-|(?!5[15]00)[0-9]{4}\-[0-9]{3}\-[0-9]{2})$ 

Mimic condizionali regex esempio: [email protected]

+1

Questo mi dà un errore di sintassi – user974061

+2

@ user974061: Potresti per favore indicare qual è il linguaggio di programmazione che stai utilizzando con queste espressioni regolari? (I condizionali sono supportati solo dai motori PCRE). – Eder

+0

@Houseman: hai letto l'intero post, o hai votato per niente? Ho fornito una risposta per i motori non basati su PCRE (che include anche Javascript). – Eder

2

Sostituire questa parte del modello [0-9]{4} con i valori letterali per 5100/5500:

/^\d{2,}\\\d{2}-(?:5[15]00-\d{3}-|(?!5[15]00)\d{4}-\d{3}-\d{2})$/ 
  • [0-9] è la stessa cosa di \d in JavaScript
  • Per la parte else, utilizzare il negative lookahead(?!5[15]00)\d{4} per garantire che non sia 5100/5500.