我想知道我能不能帮助解决这个问题。假设我有一个字符串
34342
我想找到这个字符串中的对数,即两个。我该怎么做?
编辑:好的,我真正想要的是匹配字符串中相同字符的出现次数。
答案 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]);
}
}
}
}