Posso determinare l'insieme di primo Caratteri Accompagnato da Regex modello?
Domanda
Vorrei poter calcolare l'insieme di tutti i caratteri che possono essere abbinati come prima carattere di una stringa da una determinata istanza di java.util.regex.Pattern
. Più formalmente, data la DFA equivalente ad una certa espressione regolare, voglio che l'insieme di tutte le transizioni in uscita dallo stato di avvio.
Un esempio:
Pattern p = Pattern.compile("[abc]def|daniel|chris|\\s+");
Set<Character> first = getFirstSet(p);
Il first
set dovrebbe contenere i seguenti elementi:
{ 'a', 'b', 'c', 'd', ' ', '\n', '\r', '\t' }
Tutte le idee? Sono ben consapevole che avrei potuto costruire il DFA me stesso e determinare gli stati rilevanti in quel modo, ma mi piacerebbe evitare questo tipo di problemi (leggi: non vale la pena che molto per me). Si noti che la mia lingua del paese ospitante è in realtà Scala, così mi hanno accesso a tutte le librerie di base Scala (per quello che vale).
Soluzione
Penso che si potrebbe analizzare l'espressione regolare e definire una funzione ricorsiva che opera su l'espressione regolare analizzato in una sinistra a destra-maniera, costruendo un tale insieme di primati.
Alcune cose semplici:
- Sequenza: prima (R1R2) = primo (r1) + (se '' in primo (r1) prima (r2) set altro vuoto)
- alternanza: prima (r1 | r2) = prima (R1) + prima (R2)
- Iterazione: prima (R *) = prima (r) + ''
- Personaggi: prima (c) = c
- Characterclasses: primo ([c1-cn]) = SET (c1, c2, ..., cn) ...
estenderà a tutti i primitivi e bandiere speciali tua espressione dialettale regolare conosce e vi sono buone per andare.
Altri suggerimenti
Si potrebbe risolverlo recursivly ...
- Striscia di racchiudere parentesi e chiamare recursivly.
- Spalato alternative di primo livello e chiamare recursivly per ogni parte.
- Se non ci sono alternative,
- uscita tutti i simboli a partire da sinistra fino al simbolo opzionale prima nessuno.
- Se non ci sono gruppi v'importa, uscita tutti i simboli.
Probabilmente ci sono un sacco di errori in questa idea, ma questo è quello che vorrei provare. Bisogna mettere a nudo fuori affermazione, i nomi dei gruppi e mille altre cose. E se si trova una classe di personaggio rovesciata come [^ 0-9] si devono produrre un sacco di caratteri.
Quindi suppongo che è davvero un problema complesso.