替换Java中连续的重复字符

我正在致力于Twitter数据标准化。Twitter用户经常使用诸如此类的术语来强调“爱”一词。我希望通过替换重复的字符,直到获得合适的有意义的词,将这样的重复字符变成一个适当的英语单词(我知道通过这种机制我无法区分善与恶)。

我的策略是

  1. 识别此类重复字符串的存在。我会寻找两个以上相同的字符,因为可能没有一个英文单词包含两个以上的重复字符。

        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 ");

}

}

  1. 在诸如Wordnet之类的词典中搜索此类单词

  2. 替换两个重复字符之外的所有字符,然后检入Lexicon

  3. 如果不在词典中,请删除另一个重复字符(否则将其视为拼写错误)。

由于我缺乏Java知识,所以我无法管理3和4。问题是,我不能替换两个重复的连续字符。以下代码段替换了所有重复的字符,但重复的字符除外

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

需要帮助来找出A。如何替换除2个连续重复字符之外的所有字符B.如何从A的输出中删除另一个连续字符[我认为B可以通过以下代码段进行管理]

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

编辑:WiktorStribiżew提供的解决方案可以在Java中完美运行。我想知道需要什么更改才能在python中获得相同的结果。Python使用re.sub。

回答:

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

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

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

请参阅Java演示。

如果需要使正则表达式不区分大小写,请使用"(?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

以上是 替换Java中连续的重复字符 的全部内容, 来源链接: utcz.com/qa/424337.html

回到顶部