如何从这个正则表达式生成所有可能的数字?

How do I generate all possible numbers from this regular expression?

我想获取正则表达式所有可能值的列表。

输入:

2W
9WW
7W0W3

其中 W 可以是 0 到 9 之间的任何数字。即 W = [0-9]

输出:

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

我做了什么:

我正在使用 Java 并决定创建一个 ArrayList 整数。

我创建了一个方法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;
}

是否有更好的方法或库函数可用于生成所有这些数字?

我怎样才能做到这一点?

这不是一个基于正则表达式的问题,但从算法的角度来看,您可以执行以下操作:

  • 计算字符串中 W 的数量。
  • 根据W的个数,生成range(0,9)的乘积,比如你有2个W,你需要生成两个[=14]的乘积=] 列表类似于 0,0-0,1-0,2-...-9,9
  • 循环组合并用简单的字符串格式替换它们。例如,当您迭代一个三重组合时,假设有 3 个变量 i,j,k,您想要将它们替换为像 7W0W3W 这样的字符串,您可以执行 "7%d0%dW%d"%(i,j,k).

如果你正在寻找一个通用的正则表达式来包装所有的情况,你可以使用像 (w) 这样的正则表达式(w 在捕获组中)那么你需要首先访问位置匹配组并将它们替换为组合项 ​​(i,j,k,..)。

最好将输入字符串称为 "pattern",而不是 "regular expression"。此外,最好创建一个 "virtual" 列表来按需生成字符串。这是示例实现:

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

首先我们计算 'W' 个字符的数量并相应地计算目标列表大小。然后我们 return 一个 AbstractList 的实现,对于给定的列表索引,它用索引除以 10 的余数替换 'W' 符号。此列表不占用内存,它仅在您请求时生成 String。如果您想获得此类列表的硬拷贝,可以使用 new ArrayList<>(getNumbers(pattern)).