在字符串中查找对

时间:2010-09-26 20:20:08

标签: java regex

我想知道我能不能帮助解决这个问题。假设我有一个字符串

34342

我想找到这个字符串中的对数,即两个。我该怎么做?


编辑:好的,我真正想要的是匹配字符串中相同字符的出现次数。

2 个答案:

答案 0 :(得分:7)

您可以使用backreferences查找连续出现的事物对:

(\d+)\1

这将匹配一个或多个数字字符,然后再次匹配相同的序列。 \1是一个反向引用,它引用第一个捕获组的内容。


如果要匹配字符串中多次出现的数字,可以使用类似

的模式
(\d)(?=\d*\1)

我们再次使用反向引用,但这次我们也使用lookahead。前瞻是零宽度断言,它指定在字符串中的当前位置之后必须匹配(或不匹配,如果使用否定前瞻)但不消耗任何字符或移动的内容正则表达式引擎在字符串中的位置。在这种情况下,我们将声明必须再次找到第一个捕获组的内容,但不一定直接在第一个捕获组旁边。通过在前瞻中指定\d*,如果它在相同的数字内,它将仅被视为一对(因此,如果数字之间存在空格,则该对将不匹配 - 如果这是不期望的,则{ {1}}可以更改为\d,它将匹配任何字符。

它会匹配.中的前3和4以及34342中的前1,2,3和4。但请注意,如果你有一个奇数的重复,你会得到一个额外的匹配(即。12332144将匹配前两个1),因为前瞻不会消耗。

答案 1 :(得分:0)

如果正则表达式看起来不合适,这是一种方法。这里的一种方法使用地图,另一种方法使用纯数组。我真的不知道一对是什么。是“555”三对,一对还是什么?因此,这些例程会打印出多次出现的所有字符的列表。

public class Pairs {

    public static void main(String[] args) {
        usingMap("now is the time for all good men");
        System.out.println("-----------");
        usingArrays("now is the time for all good men");
    }

    private static void usingMap(String s) {
        Map<Character, Integer> m = new TreeMap<Character, Integer>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (m.containsKey(c)) {
                m.put(c, m.get(c) + 1);
            } else {
                m.put(c, 1);
            }
        }
        for (Character c : m.keySet()) {
            if (m.get(c) > 1) {
                System.out.println(c + ":" + m.get(c));
            }
        }
    }

    private static void usingArrays(String s) {
        int count[] = new int[256];
        for (int i = 0; i < count.length; i++) count[i] = 0;

        for (int i = 0; i < s.length(); i++) {
            count[s.charAt(i)]++;
        }
        for (int i = 0; i < count.length; i++) {
            if (count[i] > 1) {
                System.out.println((char) i + ":" + count[i]);
            }
        }
    }
}