我想要一个正则表达式的所有可能值的列表。
输入:
2W
9WW
7W0W3其中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;
}是否有更好的方法或库函数来生成所有这样的数字?
我怎样才能做到这一点?
发布于 2015-08-27 08:20:06
这并不完全是一个基于正则表达式的问题,但从算法的角度来看,您可以执行以下操作:
W数。W的数量,创建range(0,9)的产品,例如,如果您有2 W,您需要创建两个[0...9]列表的产品,这些产品将类似于0,0-0,1-0,2-...-9,9。i,j,k )--您想要在像7W0W3W这样的字符串中替换它们,您可以执行"7%d0%dW%d"%(i,j,k)。如果您正在寻找一个通用正则表达式来包装所有的情况,您可以使用像(w)这样的正则表达式(捕获组中的w),那么您需要首先访问匹配组的位置,并将它们替换为组合项(i,j,k,..)。
发布于 2015-08-27 08:33:15
最好将输入字符串称为“模式”,而不是“正则表达式”。另外,最好是创建一个“虚拟”列表,根据需要生成字符串。下面是示例实现:
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'字符的数量,并相应地计算目标列表大小。然后,我们返回一个AbstractList的实现,对于给定的列表索引,用'W'符号替换为10的剩余的索引除法。此列表不占用内存,它只在请求时生成String。如果你想得到这样的名单的硬拷贝,你可以使用new ArrayList<>(getNumbers(pattern)).
https://stackoverflow.com/questions/32243814
复制相似问题