使用Java +正则表达式,我想在字符串中找到重复的字符,并用找到的字符和找到它的次数替换那些子字符串

时间:2017-06-09 06:18:49

标签: java regex

样本

String str = "fghhhhjkjkljhdd"

我需要将其转换为输出字符串" fgh4jkjkljhd2"

我有以下代码但这里的问题是我只得到一个匹配的出现 - " hhhh"。我仍然缺少" dd"。 一旦这个问题得到解决,我可以考虑如何为字符串分配匹配并在那里计算字符,但是现在我无法获得多个匹配。任何指针都表示赞赏。

    String str = "fghhhhjkjkljhdd";
    Pattern p = Pattern.compile("(\\w)\\1+");
    Matcher m = p.matcher(str);
    if (m.find()) System.out.println(m.group());

2 个答案:

答案 0 :(得分:4)

您可以使用捕获组包装量化的反向引用,以便以后能够访问此值,并使用Matcher#appendReplacement实际修改字符串中的匹配项:

String text = "fghhhhjkjkljhdd";
String regex = "(\\w)(\\1+)";
Pattern r = Pattern.compile(regex);
Matcher m = r.matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, m.group(1) + (m.group(2).length()+1));
}
m.appendTail(sb);
System.out.println(sb); // => fgh4jkjkljhd2

请参阅https://developers.google.com/web/fundamentals/security/csp/

答案 1 :(得分:0)

您也可以使用简单的循环

进行尝试
    String str = "fghhhhjkjkkljhdd";
    StringBuffer sb = new StringBuffer(String.valueOf(str.charAt(0)));
    char lastChar = str.charAt(0);
    int counter = 1;

    for (int i = 1; i < str.length(); i++) {
        if (str.charAt(i) == lastChar) {
            counter++;
        } else {
            lastChar = str.charAt(i);
            if (counter != 1) sb.append(counter);
            sb.append(lastChar);
            counter = 1;
        }
    }
    if(counter != 1) sb.append(counter);
    System.out.println(sb.toString());
    //fgh4jkjk2ljhd2