Il problema
Non esiste un modo semplice per ottenere una permutazione con una regex.
- Permutazione: ottenere una parola ("aabc") in un altro ordine, senza cambiare il numero o il tipo di lettere.
- Regex: espressione regolare.
Per verifica:
- "Regex permutazioni senza ripetizioni" La risposta crea un codice JavaScript anziché una regex, supponendo che sarebbe più semplice.
- "Come trovare tutte le permutazioni di una determinata parola in un dato testo" - Neanche la risposta usa regex.
- "Regex per abbinare tutti {1, 2, 3, 4} senza ripetizioni" - La risposta utilizza regex, ma non è né adattabile né semplice.
- Questa risposta afferma anche: "Un'espressione regolare non può fare ciò che stai chiedendo. Non può generare permutazioni da una stringa" .
Il tipo di soluzione che sto cercando
Dovrebbe avere la forma:
- »Aabc« (o qualsiasi altra cosa che potresti usare tra parentesi aperte e chiuse)
- (AABC)! (simile a (abc)? ma con un altro simbolo alla fine)
- [AABC]! (simile a [abc] + ma con un altro simbolo alla fine)
Vantaggi di queste soluzioni
Loro sono:
- facile
- adattabile
- riutilizzabile
Perché questo dovrebbe esistere
- I regex sono un modo per descrivere una grammatica di una lingua normale. Hanno il pieno potere di essere qualsiasi tipo di linguaggio regolare.
- Diciamo che le lingue regolari sono abbastanza potenti per permutazioni (prova di seguito) - perché non esiste un modo semplice per esprimerlo?
Quindi la mia domanda è:
- (Perché) La mia prova è sbagliata?
- Se è giusto: perché non esiste un modo semplice per esprimere le permutazioni?
La prova
- Le espressioni regolari sono un modo per annotare la grammatica di una lingua normale. Possono descrivere qualsiasi grammatica delle lingue regolari.
- Un altro modo per descrivere le lingue regolari (che hanno un numero finito di lettere all'interno dell'alfabeto) sono gli automi non deterministici (con un numero finito di stati).
Avendo un numero finito di lettere posso creare questo automa: (Esempio. Formale: vedi sotto)
Grammatica che accetta permutazioni di "abbc":
(in cerca di numeri in cima, forse qualcuno sa come rendere migliore questa parte)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (nessun errore di battitura! equivalenza)
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h¹² -> bb
h²² -> ac
h²² -> ca
h²³ -> ab
h²³ -> ba
Più formale: (usando un automa a stati finiti ma questo potrebbe essere fatto anche con la grammatica)
- Una parola q (con lunghezza finita) a cui qualsiasi permutazione dovrebbe raggiungere uno stato accettante.
- X è l'alfabeto finito.
- Set di stati S contiene qualsiasi ordine di lettere fino alla lunghezza di q. (Quindi la dimensione di S è finita.) Più uno stato di "qualsiasi parola più".
- funzione di transizione di stato d che accetta una lettera e si sposta sullo stato che corrisponde alla parte ora letta della parola.
- F è un insieme di quegli stati che sono permutazioni esatte di q.
Quindi è possibile creare un automa a stati finiti per accettare permutazioni di una determinata parola.
Passando alla prova
Quindi ho dimostrato che le lingue normali hanno il potere di controllare le permutazioni, vero?
Quindi perché non esiste un approccio per raggiungere questo obiettivo con Regexes? È una funzionalità utile.
^(a()|a()|b()|c()){4}\2\3\4\5$
sembra funzionare (vedi regex101.com/r/9URPpg/4/tests ).