2015-12-26 16 views
5

Voglio scrivere un'espressione regolare per i numeri binari Divisibile per 5.
Ho già fatto le espressioni regolari per i numeri binari Divisibili per 2 e per 3 ma non sono riuscito a trovarne uno per 5.Espressione regolare per numeri binari Divisibile per 5

Qualche suggerimento?

+0

Mostraci cosa hai provato e come non funziona. –

+0

non so da dove iniziare perché i numeri sono molto diversi: 0101, 1010, 1111, 10100 ... non esiste una regola speciale da applicare –

+2

I criteri di divisibilità Pascal generalizzati danno una sequenza ridotta di (1, 2, 4, 3, 1, ...) e difficilmente riesco a vedere come questo possa essere utilizzato dalla regex.Tuttavia, se il tuo obiettivo finale è solo quello di verificare un enorme numero binario per divisibilità, puoi utilizzarlo direttamente. È sufficiente passare il numero da cifre multiple di cifre più basse su numeri di sequenza e raccolta totale. Il resto del totale è il resto del numero iniziale. Questo è il miglior collegamento che ho trovato finora http://mathworld.wolfram.com/DivisibilityTests.html –

risposta

14
(0|1(10)*(0|11)(01*01|01*00(10)*(0|11))*1)* 

Aggiungi ^$ per testarlo con regexp. See it working here.


È possibile creare un DFA e convertirlo in espressioni regolari. Il DFA era già stato creato nel another answer. Puoi leggerlo, è molto ben spiegato.
L'idea generale è di rimuovere i nodi, aggiungendo i bordi. before

diventa:

after


Utilizzando questo concetto e l'FDS dalla risposta ho linkato, qui sono i passi per ottenere l'espressione regolare: step1 step2 step3 step4 step5

+0

Sarei molto felice se la tua risposta è corretta. Ma se la tua risposta è corretta, perché questo non corrisponde? https://regex101.com/r/hP1cO0/1 – ferit

+0

@Saibot, ummm ... [Corrisponde] (https://regex101.com/r/hP1cO0/2). – ndn

+0

Trovato perché. OK. Hai ragione, congratulazioni! Sono molto contento di vedere la tua risposta al lavoro, perché ho trascorso 3 ore a cercare un'espressione regolare, e sono rimasto deluso perché pensavo che non ci fosse una soluzione. – ferit

1
2^0 = 1 = 1 mod 5 
2^1 = 2 = 2 mod 5 
2^2 = 4 = -1 mod 5 
2^3 = 8 = -2 mod 5 
2^4 = 16 = 1 mod 5 
2^5 = 32 = 2 mod 5 
    ...  -1 mod 5 
    ...  -2 mod 5 

Quindi abbiamo un modello 1, 2, -1, -2. Esistono due subpatterns in cui solo il segno del numero si alterna: Let n è il numero di cifre e il numero della cifra meno significativa è 0; modello dispari è

(-1)^(n) 

e anche modello è

2x((-1)^(n)) 

Così, come utilizzare questo?

Lascia che il numero originale sia 100011, dividi le cifre dei numeri in due parti, pari e dispari. Sommare le cifre di ciascuna parte separatamente. Moltiplicare la somma delle cifre dispari per 2. Ora, se il risultato è divisibile per somma delle cifre pari, allora il numero originale è divisibile per 5, altrimenti non è divisibile. Esempio:

100011 
1_0_1_ 1+0+1 = 2 
_0_0_1 0+0+1 = 1; 1x2 = 2 

2 mod(2) equals 0? Yes. Therefore, original number is divisible. 

Come applicarlo all'interno di un'espressione regolare? Utilizzando le funzioni callout all'interno di un'espressione regolare può essere applicato. I callout forniscono un mezzo per passare temporaneamente il controllo allo script nel mezzo della corrispondenza del modello di espressioni regolari.

Tuttavia, la risposta di ndn è più appropriata e più semplice, quindi consiglio di usare la sua risposta.

+1

Penso che OP volesse il concetto matematico di espressioni regolari, non regexp con callouts. – ndn

+2

* "Non c'è modo di farlo in pura regex" * - falso, vedere la mia risposta. – ndn

0

Tuttavia, "^ (0 | 1 (10) * (0 | 11) (01 * 01 | 01 * 00 (10) * (0 | 11)) 1) $ "corrisponde alla stringa vuota.

+0

Questo risponde veramente alla domanda? Si prega di fornire ulteriori informazioni se lo fa. –

Problemi correlati