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).

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top