如何用该单词的单一版本替换重复单词

And*_*ert 3 c# regex regex-replace

我正在尝试使用 C# 处理似乎使用语音转文本的文字记录。我遇到的一个主要问题是重复单词和/或短语。我很想使用正则表达式来替换它们。这里有些例子:

我我我真的很想去,但是我不去,去不了。

我真的很想使用正则表达式替换,所以它会变成这样

我真的很想去,但我去不了。

看来我有多次单词重复,无论是否有逗号。如果我尝试替换寻找特定的,它将替换 3 个中的 2 个,但保留最后两个。因此,想出一种方法来查找多个重复并用该单词的单个版本替换它们,这已经成为一种巨大的痛苦,所以如果我有 I,I,I..... 它会被替换为 I 或 II它只用一个 I 代替。

另外,如果有这样的短语:

你知道,你知道,你知道

希望能够用一个代替三个

我已经尝试过这样的:\b(\w+)\s+\1\b,但它不适用于逗号

我已经看过了,但找不到任何寻找逗号分隔的内容。如果必须多次调用我也没关系,但只是想弄清楚。

任何帮助,将不胜感激!

mar*_*lex 5

您可以(\b\w+(?:\s+\w+)*?)(,?\s*\1)+\b与替换字符串一起使用$1

这里

  • (\b\w+(?:\s+\w+)*?)匹配一个或多个由空格符号分隔的单词:
    • \b\w+匹配单词开头的单词符号,
    • (?:\s+\w+)*?多个空格符号后跟单词符号,重复任意次数(尽可能低)。
  • (,?\s*\1)+匹配与第一组匹配的相同单词(因此\1),用可选逗号和任意数量的空格分隔,重复多次。
  • \b确保最后的重复不会在单词中间停止。

演示在这里

警告:此正则表达式将删除所询问的任何重复内容。但有时单词的重复也是有效的。就像是We'll move, move far away


编辑:为了适应重复之间的点,您可以使用

(\b\w+(?:\s+\w+)*?)([,.]?\s*\1)+\b
Run Code Online (Sandbox Code Playgroud)

它将匹配重复单词之间的以下分隔符:,., . ,

如果您想匹配标点符号和空格的任意组合,您可以使用

(\b\w+(?:\s+\w+)*?)([,.\s]*\1)+\b
Run Code Online (Sandbox Code Playgroud)

甚至

(\b\w+(?:\s+\w+)*?)([\p{P}\s]*\1)+\b
Run Code Online (Sandbox Code Playgroud)

第一个匹配点、逗号和空格的任意组合,例如,. , .。其次 - 例如,空格和任何标点符号的任意组合*;!? .

演示在这里