2015-08-27 21 views
5

Voglio ottenere un elenco di tutti i valori possibili per un'espressione regolare.Come posso generare tutti i numeri possibili da questa espressione regolare?

ingresso:

2W 
9WW 
7W0W3 

dove W può essere qualsiasi cifra compresa tra 0 e 9. cioè W = [0-9]

uscita:

20,21,22,....29 
900,901,...910,911,...999 
70003,70013,70023,...71003,72003,...79093 

Quello che ho fatto:

Sto usando Java e ho deciso di creare un numero ArrayList di Integers.

Ho creato un metodo ArrayList<Integer> getNumbers(String regex).

ArrayList<Integer> getNumbers(String regex){ 

ArrayList<Integer> fullList = new ArrayList<Integer>(); 

char[] cArray = regex.toCharArray(); //converted the string into a character array. 

    for(int i=1;i<cArray.length;i++) { 

     if(cArray[i] == 'W') {    

      for(int j=0;j<10;j++) { 
       //I'm not sure what goes here 
       fullList.add(the number with 'w' at this index replaced by 'j'); 
      }    
     } 

    } 
return fullList; 
} 

c'è un modo o biblioteca funzioni migliori disponibili per generare tutti questi numeri?

Come posso ottenere questo risultato?

Qualsiasi aiuto per favore.

+0

Questo è opposto a ciò che fa regex. Non so se ci sono librerie che generano possibili stringhe che corrispondono a un modello. –

+0

Regex non ha nulla a che fare con questa domanda .. Si tratta di logica qui – TheLostMind

+0

Il pacchetto Python 'sre_yield' fornisce un elenco di tutte le stringhe corrispondenti per un modello di espressioni regolari. – IceArdor

risposta

1

questo non è completamente un compito espressione regolare, ma con un punto di vista algoritmico è possibile effettuare le seguenti operazioni:

  • contare il numero di W 's nella stringa.
  • In base al numero di W 's, creare il prodotto di range(0,9), ad esempio, se si dispone di 2 W è necessario creare il prodotto di 2 lista [0...9], che sarebbe 0,0-0,1-0,2-...-9,9.
  • Passa sopra le combinazioni e sostituiscile con una semplice formattazione di stringhe. Ad esempio, quando stai iterando su una tripla combinazione, supponi con 3 variabili i,j,k e desideri sostituirle su una stringa come 7W0W3W, puoi fare "7%d0%dW%d"%(i,j,k).

E se siete alla ricerca di una regex generale per avvolgere tutti i casi è possibile utilizzare una regex come (w) (w in un gruppo di cattura) allora avete bisogno di primo accesso alla posizione dei gruppi partita e sostituirli con combinazioni di elementi (i,j,k,..).

+0

Grazie! Fatto! :) Ci proverò! – Nikhil

+1

@nikhil Contento di ciò, è possibile utilizzare una funzione in java che crea il prodotto di più elenchi o (qualsiasi iterabile), per creare i prodotti. – Kasramvd

2

È preferibile chiamare la stringa di input come "modello", non "espressione regolare". Inoltre è probabilmente meglio creare una lista "virtuale" che generi le stringhe su richiesta. Ecco l'implementazione del campione:

public static List<String> getNumbers(String pattern) { 
    final char[] chars = pattern.toCharArray(); 
    int size = 1; 
    for(char ch : chars) 
     if(ch == 'W') { 
      if(size == 1_000_000_000) 
       throw new IllegalArgumentException("Too many 'W' to fit the list"); 
      size*=10; 
     } 
    final int finalSize = size; 
    return new AbstractList<String>() { 

     @Override 
     public String get(int index) { 
      char[] res = chars.clone(); 
      for(int i=res.length-1; i>=0; i--) { 
       if(res[i] == 'W') { 
        res[i] = (char) ('0'+(index % 10)); 
        index/=10; 
       } 
      } 
      return new String(res); 
     } 

     @Override 
     public int size() { 
      return finalSize; 
     } 
    }; 
} 

In primo luogo abbiamo contare il numero di caratteri 'W' e calcolare la dimensione lista degli obiettivi di conseguenza. Quindi restituiamo un'implementazione di AbstractList che per un determinato indice di lista sostituisce i simboli 'W' con i residui della divisione indice per 10. Questo elenco non occupa la memoria, genera lo String solo quando lo si richiede. Se si desidera ottenere la copia cartacea di tale elenco, è possibile utilizzare new ArrayList<>(getNumbers(pattern)).

+0

Grazie per la risposta @Tagir Valeev. Lo proverò :) – Nikhil

Problemi correlati