2015-08-27 12 views
5

Ich möchte eine Liste aller möglichen Werte für einen regulären Ausdruck erhalten.Wie generiere ich alle möglichen Zahlen von diesem regulären Ausdruck?

Eingang:

2W 
9WW 
7W0W3 

wo W jede Ziffer von 0 bis 9 sein kann, das heißt W = [0-9]

Ausgang:

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

Was ich tat:

Ich benutze Java und entschied mich, eine ArrayList von Integers zu erstellen.

Ich erstellte eine Methode 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; 
} 

Gibt es einen besseren Weg, oder Bibliotheksfunktionen zur Verfügung, alle diese Zahlen zu generieren?

Wie kann ich das erreichen?

Jede Hilfe bitte. Diese

+0

Dies ist das Gegenteil von was Regex tut. Ich weiß nicht, ob es Bibliotheken gibt, die mögliche Zeichenfolgen erzeugen, die einem Muster entsprechen. –

+0

Regex hat nichts mit dieser Frage zu tun. Alles über Logik hier – TheLostMind

+0

Python-Paket 'sre_yield' bietet eine Liste aller übereinstimmenden Strings für ein reguläres Ausdrucksmuster. – IceArdor

Antwort

1

ist nicht vollständig ein regex Aufgabe, aber bei einer algorithmischen Perspektive können Sie die folgenden Schritte ausführen:

  • die Anzahl der W ‚s in Ihrem String Count.
  • Basierend auf der Anzahl der W ‚s, das Produkt von range(0,9), zum Beispiel erstellen, wenn Sie 2 W haben müssen Sie das Produkt von 2 Liste [0...9], schaffen, die 0,0-0,1-0,2-...-9,9 wäre.
  • Wiederholen Sie die Kombinationen und ersetzen Sie sie durch eine einfache Zeichenfolgenformatierung. Wenn Sie zum Beispiel über eine Dreifachkombination mit 3 Variablen i,j,k iterieren und diese in einer Zeichenfolge wie 7W0W3W ersetzen möchten, können Sie "7%d0%dW%d"%(i,j,k) tun.

Und wenn Sie für eine allgemeine regex suchen alle Fälle wickeln können Sie einen regulären Ausdruck wie (w) (w in einer Capture-Gruppe) verwenden, dann müssen Sie zunächst den Zugang zu Position der Spiel-Gruppen und ersetzen sie durch Kombinationen Artikel (i,j,k,..).

+0

Danke! Ich habs! :) Probieren Sie es aus! – Nikhil

+1

@nikhil Froh, dass Sie eine Funktion in Java verwenden können, die das Produkt aus mehreren Listen oder (beliebig iterierbar) erstellen, um die Produkte zu erstellen. – Kasramvd

2

Es ist besser, die Eingabezeichenfolge als "Muster", nicht als "regulärer Ausdruck" zu bezeichnen. Auch ist es wahrscheinlich besser, eine "virtuelle" Liste zu erstellen, die die Zeichenfolgen bei Bedarf generiert. Hier ist die Beispielimplementierung:

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; 
     } 
    }; 
} 

Zuerst haben wir die Anzahl der 'W' Zeichen zählen und die Zielliste Größe entsprechend berechnen. Dann geben wir eine Implementierung von AbstractList zurück, die für gegebenen Listenindex die 'W' Symbole mit den Resten der Indexdivision durch 10 ersetzt. Diese Liste nimmt nicht den Speicher, es erzeugt das String nur, wenn Sie es anfordern. Wenn Sie die Hardcopy einer solchen Liste erhalten möchten, können Sie new ArrayList<>(getNumbers(pattern)) verwenden.

+0

Danke für die Antwort @Tagir Valeev. Werde es versuchen. :) – Nikhil

Verwandte Themen