【问题标题】:Replacing consecutive repeated characters in java替换java中连续重复的字符
【发布时间】:2017-04-25 08:23:03
【问题描述】:

我正在研究 Twitter 数据规范化。 Twitter 用户经常使用诸如 ts I looooooove it 之类的术语来强调爱这个词。我想通过替换重复字符直到我得到一个适当的有意义的单词,将这些重复的字符变成一个适当的英文单词(我知道我无法通过这种机制区分好和上帝)。

我的策略是

  1. 识别此类重复字符串的存在。我会寻找超过 2 个相同的字符,因为可能没有超过两个重复字符的英语单词。

    String[] strings = { "stoooooopppppppppppppppppp","looooooove", "good","OK", "boolean", "mee", "claaap" };
    
    String regex = "([a-z])\\1{2,}";
    Pattern pattern = Pattern.compile(regex);
    
    for (String string : strings) {
         Matcher matcher = pattern.matcher(string);
         if (matcher.find()) {
             System.out.println(string+" TRUE ");
         }
    }
    
  2. 在 Wordnet 等词典中搜索此类单词

  3. 替换除两个这样的重复字符之外的所有字符并签入 Lexicon
  4. 如果词典中没有,则再删除一个重复字符(否则将其视为拼写错误)。

由于我的 Java 知识贫乏,我无法管理 3 和 4。问题是除了两个重复的连续字符外,我无法替换所有字符。 以下代码 sn -p 替换除一个重复字符以外的所有字符System.out.println(data.replaceAll("([a-zA-Z])\\1{2,}", "$1"));

需要帮助才能找到 A. 如何替换除 2 个连续重复字符之外的所有字符 B. 如何从 A 的输出中再删除一个连续字符 [我觉得B可以通过下面的代码sn-p来管理]

System.out.println(data.replaceAll("([a-zA-Z])\\1{1,}", "$1"));

编辑:Wiktor Stribiżew 提供的解决方案在 Java 中完美运行。我想知道在 python 中获得相同结果需要进行哪些更改。 Python 使用 re.sub。

【问题讨论】:

  • .replaceAll(regex, "$1$1") 不适合你吗?那么,.replaceAll(regex, "$1") 将只保留 1 个。
  • 太棒了!有用。 .replaceAll(regex, "$1$1") 保留除 2 个连续字符外的所有字符。请解释一下 $1$1 的工作原理。

标签: java regex


【解决方案1】:

您的正则表达式 ([a-z])\\1{2,} 匹配并捕获一个 ASCII 字母到第 1 组,然后匹配该值的 2 次或更多次出现。因此,您需要替换为保存捕获值的反向引用 $1。如果您使用一个$1,aaaaa 将被替换为一个a,如果您使用$1$1,它将被替换为aa。

String twoConsecutivesOnly = data.replaceAll(regex, "$1$1");
String noTwoConsecutives = data.replaceAll(regex, "$1");

请参阅Java demo。

如果您需要使您的正则表达式不区分大小写,请使用"(?i)([a-z])\\1{2,}" 甚至"(\\p{Alpha})\\1{2,}"。如果必须处理任何 Unicode 字母,请使用 "(\\p{L})\\1{2,}"。

奖励:在一般情况下,要替换任意数量的任何重复连续字符,请使用

text = text.replaceAll("(?s)(.)\\1+", "$1");   // any chars
text = text.replaceAll("(.)\\1+", "$1");       // any chars but line breaks
text = text.replaceAll("(\\p{L})\\1+", "$1");  // any letters
text = text.replaceAll("(\\w)\\1+", "$1");     // any ASCII alnum + _ chars

【讨论】:

  • 只是为了学术兴趣,如果我想替换除 3 个重复字符之外的所有字符,.replaceAll 的替换字符串参数是什么。
  • 能否提供一个示例字符串和预期输出?
  • 有一个问题。如果字符串是“stoooooopppppppppppppppppp”;上面的正则表达式仅适用于第一次出现的重复,我们得到一个类似 stoopp 的输出。正确的输出应该是 stoooppp。
  • 我认为我很好地解释了这种方法。只需在替换模式中再添加一个反向引用,使用$1$1$1。
【解决方案2】:
/*This code checks a character in a given string repeated consecutively 3 times
 if you want to check for 4 consecutive times change count==2--->count==3 OR
 if you want to check for 2 consecutive times change count==2--->count==1*/
public class Test1 {
    static char ch;
    public static void main(String[] args) {
        String str="aabbbbccc";
        char[] charArray = str.toCharArray();
        int count=0;
        for(int i=0;i<charArray.length;i++){
            if(i!=0 ){
            if(charArray[i]==ch)continue;//ddddee
            if(charArray[i]==charArray[i-1]) {
                count++;
                if(count==2){
                    System.out.println(charArray[i]);
                    count=0;
                    ch=charArray[i];
                }   
            }
            else{
                count=0;//aabb

            }
            }


        }

    }

}

【讨论】:

  • 这个程序会检查字符串中的连续字符。
  • 这将只运行并逐个字符搜索。根本没有效率。对于询问正则表达式的用户来说,这不是一个好的答案
猜你喜欢
  • 1970-01-01
  • 2020-07-19
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2022-12-17
相关资源
最近更新 更多