我不太了解正则表达式。我试图找到以数字2,3,5或7开头的字符串,整个中间是1,3,7或9,最后是3或7。
我的尝试是[2357] [1379] * [37]。这是行不通的。我很感激修正。请记住,这适用于Java String.matches()函数。提前致谢
for (int s = 0; s < primes.size(); ++s) {
String p = primes.get(s);
if (!p.matches([REGEX GOES HERE])) {
System.out.println(p);
primes.remove(s);
}
}
答案 0 :(得分:1)
迭代从循环中删除的集合的标准方法是迭代向下,这样删除不会影响后续元素的索引:
for (int s = primes.size() - 1; s >= 0; s--) {
String p = primes.get(s);
if (!p.matches("[2357][1379]*[37]")) {
System.out.println(p);
primes.remove(s);
}
}
现在无需担心删除元素的含义。
答案 1 :(得分:0)
嗨我不确定自己错了..但是我的初始模式中没有看到任何错误,例如
String aa = "[2357][1379]*[37]";
String bb = "2977313";
boolean matches = Pattern.matches(aa, bb);
System.out.println("1) "+matches);
我从没有2开始,然后以3没有结束,并在其间添加了1379,它按预期工作。如果我错了,请纠正我
答案 2 :(得分:0)
以下代码“正常”:
List<String> primes = new ArrayList<String>();
primes.add("1");
primes.add("2");
primes.add("7");
primes.add("23");
primes.add("213");
primes.add("243");
primes.add("2113");
primes.add("2193");
for (int s = 0; s < primes.size(); ++s) {
String p = primes.get(s);
if (!p.matches("[2357][1379]*[37]")) {
System.out.println(p);
primes.remove(s);
}
}
输出:
1
7
243
您可能希望输出:
1
2
7
243
但是,primes.remove(s)
会扰乱你的循环。这实际上不是您设计的目的。 (但谁知道?!)以下是避免弄乱你的循环的众多解决方案之一:
for (String prime : new ArrayList<String>(primes)) {
if (!prime.matches("[2357][1379]*[37]")) {
System.out.println(prime);
primes.remove(prime);
}
}
答案 3 :(得分:0)
您的正则表达式效果很好。但是,remove
会将所有后续元素向左移动,因此通常位于String
的{{1}}会移至{{ 1}},因此要检查的下一个元素位于s + 1
而不是s
。修正:
s