【问题标题】:Regex to replace a repeating string pattern正则表达式替换重复的字符串模式
【发布时间】:2023-03-16 07:00:01
【问题描述】:

我需要用每个基本构造单元替换单词中的重复模式。例如 我有字符串“TATATATA”,我想用“TA”替换它。此外,我可能会替换超过 2 次重复以避免替换正常单词。

我正在尝试在 Java 中使用 replaceAll 方法。

【问题讨论】:

  • 你的代码/正则表达式在哪里?
  • 如果你已经在使用replaceAll(),有什么问题? replaceAll 完全符合您的要求(如果您有上述的简单模式)。
  • 我不想只替换“TATATATA”,而是任何重复的字符串。 @TheLostMind 我没有任何正则表达式的想法。
  • 您是指字符串中可能出现的任何重复字符,例如 TATATATA 或 YTYTYT 或 ABCABCABC?
  • 看我的回答,我想我明白了

标签: java regex string pattern-matching replaceall


【解决方案1】:

我想你想要这个(适用于任何长度的重复字符串):

String result = source.replaceAll("(.+)\\1+", "$1")

或者,优先考虑较短的匹配:

String result = source.replaceAll("(.+?)\\1+", "$1")

它首先匹配一组字母,然后再次匹配(使用匹配模式本身的反向引用)。我试过了,它似乎可以解决问题。


例子

String source = "HEY HEY duuuuuuude what'''s up? Trololololo yeye .0.0.0";

System.out.println(source.replaceAll("(.+?)\\1+", "$1"));

// HEY dude what's up? Trolo ye .0

【讨论】:

    【解决方案2】:

    您最好在此处使用Pattern 而不是.replaceAll()。例如:

    private static final Pattern PATTERN 
        = Pattern.compile("\\b([A-Z]{2,}?)\\1+\\b");
    
    //...
    
    final Matcher m = PATTERN.matcher(input);
    ret = m.replaceAll("$1");
    

    编辑:示例:

    public static void main(final String... args)
    {
        System.out.println("TATATA GHRGHRGHRGHR"
            .replaceAll("\\b([A-Za-z]{2,}?)\\1+\\b", "$1"));
    }
    

    打印出来:

    TA GHR
    

    【讨论】:

    • 没用,打印整个字符串。感谢您的回答!
    • 是的,我在最后尝试了一个额外的字符,比如“TATATAT”。
    【解决方案3】:

    既然您要求使用正则表达式解决方案:

    (\\w)(\\w)(\\1\\2){2,};
    

    (\w)(\w):匹配每对连续的单词字符((.)(.) 将捕获每对任何类型的连续字符),将它们存储在capturing groups 1 和 2 中。(\\1\\2) 匹配任何时候这些组中的字符之后立即再次重复,{2,} 在重复两次或多次时匹配({2,10} 在重复超过 1 次但少于 10 次时匹配)。

    String s = "hello TATATATA world";    
    Pattern p = Pattern.compile("(\\w)(\\w)(\\1\\2){2,}");
    Matcher m = p.matcher(s);
    while (m.find()) System.out.println(m.group());
        //prints "TATATATA"
    

    【讨论】:

    • 恐怕只打印第一个字母。感谢您的回答!
    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    相关资源
    最近更新 更多