regex 如何将重复的单词替换为该单词的单个版本

lx0bsm1f  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(151)

我正在尝试用C#处理似乎使用语音到文本的转录。我遇到的一个主要问题是重复单词和/或短语。我喜欢使用RegEx表达式来替换它们。以下是一些例子:
我,我,我很想去,但是我我不行,不行。
我真的很想使用regex替换,所以它会变成这样的东西
我真的很想去,但是我不能去。
看起来我有很多次单词重复,无论是有逗号还是没有逗号。如果我尝试寻找特定的替换,它将替换3中的2个,但留下最后两个。所以找到一种方法来寻找多个重复并将其替换为该单词的单个版本,这就成了一件皇家痛苦的事情,所以如果我有I,I,I。....它被替换为I或I I,并且它仅替换为一个I。
此外,如果有这样的短语:
你知道你知道你知道
希望能用一个人代替三个人
我试过这样的:\b(\w+)\s+\1\b,但它不适用于逗号
我已经看过了,真的找不到任何东西,寻找逗号分隔的。如果要打好几通电话我也没意见,但我只是想弄清楚。
任何帮助将不胜感激!

9q78igpj

9q78igpj1#

您可以使用(\b\w+(?:\s+\w+)*?)(,?\s*\1)+\b和替换字符串$1
给你

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

演示here

**注意:**这个正则表达式将删除任何重复的问题。但有时重复的话可能是有效的。类似于We'll move, move far away
编辑:为了在重复之间容纳点,您可以使用

(\b\w+(?:\s+\w+)*?)([,.]?\s*\1)+\b

它将匹配重复单词之间的以下分隔符:,.,.,等。
如果你想匹配任何标点符号和空格的组合,你可以使用

(\b\w+(?:\s+\w+)*?)([,.\s]*\1)+\b

甚至

(\b\w+(?:\s+\w+)*?)([\p{P}\s]*\1)+\b

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

hjqgdpho

hjqgdpho2#

可以将以下正则表达式的匹配项转换为空字符串。

((?:\w+\s+)*\w+),?\s*(?=\1\b)

这个想法是删除一个短语,如果同一个短语紧跟着。
Demo
此正则表达式具有以下元素。

(            begin capture group 1
  (?:        begin a non-capture group
    \w+\s+   match >= 1 word chars followed by >= 1 whitespaces
  )*         end non-capture group and execute >= 0 times
  \w+        match >= 1 word chars
)            end capture group 1
,?           optionally match a comma
\s*          match >= 0 whitespaces
(?=          begin positive lookahead
  \1\b       match content of capture group 1 followed by a word boundary
)            end positive lookahead
cuxqih21

cuxqih213#

想要在评论中感谢MarkAlex提供的解决方案

(\b[\w]+(?:\s+[\w]+)*)(,?\s*\1)+

相关问题