Java 在字符串中查找对

Java 在字符串中查找对,java,regex,Java,Regex,我想知道我是否能在这个问题上得到一些帮助。假设我有一根绳子 34342 我想找出这个字符串中的对数,应该是2。我该怎么做呢 编辑:好的,我真正想要的是匹配字符串中出现的相同字符。您可以使用查找一行中出现的成对内容: (\d+)\1 这将再次匹配一个或多个数字字符,后跟相同的序列\1是指第一捕获组的内容的反向引用 如果要匹配字符串中多次出现的数字,可以使用以下模式 (\d)(?=\d*\1) 我们再次使用了反向引用,但这次我们也使用了。lookahead是一个零宽度断言,如果在字符串中的当前

我想知道我是否能在这个问题上得到一些帮助。假设我有一根绳子

34342
我想找出这个字符串中的对数,应该是2。我该怎么做呢

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

您可以使用查找一行中出现的成对内容:

(\d+)\1
这将再次匹配一个或多个数字字符,后跟相同的序列\1是指第一捕获组的内容的反向引用

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

(\d)(?=\d*\1)
我们再次使用了反向引用,但这次我们也使用了。lookahead是一个零宽度断言,如果在字符串中的当前位置后使用负的lookahead,则指定必须匹配或不匹配的内容,但不使用任何字符或移动正则表达式引擎在字符串中的位置。在本例中,我们将断言必须再次找到第一个捕获组的内容,尽管不一定直接在第一个捕获组的旁边。通过在前瞻中指定\d*,仅当它位于同一个数字内时,才会将其视为一对。因此,如果数字之间有空格,则该对将不匹配-如果这是不需要的,则可以将\d更改为。这将匹配任何字符


它将匹配34342中的前3和4以及12332144中的前1、2、3和4。但是请注意,如果重复次数为奇数,您将获得一个额外的匹配,即1112将匹配前两个1,因为lookaheads不会消耗。如果正则表达式看起来不合适,这里有一种方法。这里的一个方法使用映射,另一个使用纯数组。我真的不知道什么是一对。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]);
            }
        }
    }
}

这很有趣,因为我数到3。一对又是什么?两对必须像示例中那样相邻吗?同样正如斯宾德所指出的,两个数字的计数是否与一对相同?33331将是12或3…对?不清楚这对数字是34,一行重复两次,还是3和4,在字符串中出现两次。我的回答涵盖了第一种情况。来吧。我数了一对三,一对四和一对34。我不明白哪一点?+1我认为这是使用正则表达式的一个很好的解决方案。然而,我不认为正则表达式是解决这个问题的理想技术。问题是关于正则表达式的,所以我试着想出一个正则表达式的解决方案,但最好使用字符串函数。不,我认为这很聪明。我从来没有在regex上使用过lookahead,所以今天我学到了一些东西。谢谢