如何从这个正则表达式生成所有可能的数字?
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))
.
我想获取正则表达式所有可能值的列表。
输入:
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))
.