0

我不太了解正则表达式。我正在尝试查找以数字 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);
        }
    }
4

4 回答 4

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

现在无需担心删除元素的影响。

于 2013-09-19T04:39:40.380 回答
0

嗨,我不确定我是不是弄错了..但我在你的初始模式中没有看到任何错误,例如

String aa = "[2357][1379]*[37]";
String bb = "2977313";

boolean matches = Pattern.matches(aa, bb); 
System.out.println("1) "+matches);

我从 2 开始,然后以 3 结束,并在其间添加了 1379,它按预期工作。如果我错了请纠正我

于 2013-09-19T03:56:46.857 回答
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);
        }
    }
于 2013-09-19T04:03:53.007 回答
0

您的正则表达式运行良好。但是,remove将任何后续元素向左移动,因此String通常 at 位置s + 1移动到s,因此要检查的下一个元素是在位置s而不是s + 1。使固定:

for (int s = 0; s < primes.size();) {
    String p = primes.get(s);

    if (!p.matches("[2357][1379]*[37]")) {
        System.out.println(p);
        primes.remove(s);
    } else 
        ++s;
}
于 2013-09-19T04:08:56.573 回答