2015-08-27 14 views
5

Düzenli ifade için olası tüm değerlerin bir listesini almak istiyorum.Bu normal ifadeden tüm olası sayıları nasıl oluştururum?

Girdi: Yaptıklarımı

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

: W 0 ile 9 arasında, yani W = [0-9]

çıkış için bir rakam olabilir

2W 
9WW 
7W0W3 

Java kullanıyorum ve ArrayList Integers oluşturmaya karar verdim.

ArrayList<Integer> getNumbers(String regex) yöntemini oluşturdum.

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

tür tüm sayılar oluşturmak için kullanılabilir daha iyi bir yolu veya kütüphane fonksiyonları var mı?

Bunu nasıl başarabilirim?

Herhangi bir yardım lütfen.

+0

Bu, normal ifadenin tam tersidir. Bir desen ile eşleşen olası dizeleri üreten kitaplıklar olup olmadığını bilmiyorum. –

+0

Regex'in bu soruyla bir ilgisi yok .. Buradaki tüm mantık hakkında – TheLostMind

+0

Python paketi 'sre_yield', düzenli bir ifade deseni için tüm eşleşen dizelerin bir listesini sağlar. – IceArdor

cevap

1

Bu tamamen regex görev değildir ama algoritmik bir perspektiften de aşağıdaki adımları yapabilirsiniz:

  • sizin dizede W 's sayısını. Eğer 2 W varsa W 's sayısına dayanarak
  • , örneğin, range(0,9) ürününü oluşturmak Eğer 0,0-0,1-0,2-...-9,9 olurdu 2 listenin [0...9], ürününü oluşturmak gerekir.
  • Kombinasyonların üzerine gelin ve bunları basit bir dizgi biçimlendirmesiyle değiştirin. Örneğin, 3 değişken i,j,k değişkeniyle varsayalım ve bunları 7W0W3W gibi bir dize üzerinde değiştirmek istediğinizde "7%d0%dW%d"%(i,j,k) yapabilirsiniz.

Ve tüm davaları sarmak için genel ifadeler için aradığınız Eğer (bir yakalama grubundaki w) bir (w) gibi normal ifadeler kullanabilirsiniz o zaman maç gruplarının pozisyonuna ilk erişime gerekiyor ve bunların yerine kombinasyon öğeleri (i,j,k,..).

+0

Teşekkürler! Anladım! :) Bir deneyecek! – Nikhil

+1

@nikhil Bunun için, ürünü oluşturmak için birden fazla listeyi veya (herhangi bir yinelenebilir) ürününü yaratan bir java işlevini kullanabilirsiniz. – Kasramvd

2

"Normal ifade" değil, giriş dizesini "kalıp" olarak çağırmak daha iyidir. Ayrıca talep üzerine dizeleri üreten bir "sanal" liste oluşturmak muhtemelen daha iyidir. İşte örnek uygulama görebilirsiniz:

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

Önce 'W' karakter sayısını ve buna göre hedef listesi boyutunu hesaplamak. Daha sonra, 10 tarafından verilen liste dizininin geri kalanıyla 'W' sembollerinin yerini alan verilen liste dizini için AbstractList'un bir uygulamasına döneceğiz. Bu liste hafızayı almaz, sadece talep ettiğinizde String üretir. Bu listenin bir kopyasını almak istiyorsanız, new ArrayList<>(getNumbers(pattern))'u kullanabilirsiniz.

+0

@Tagir Valeev'in cevabı için teşekkürler. Denerim. :) – Nikhil

İlgili konular