使用正则表达式删除连续的重复字符

时间:2012-11-28 01:24:35

标签: c# regex replace

让我们说我有这样的事情:

. . . . First . . Second. . . . . Third . . . 

所需的输出是:

.First.Second.Third.

如何使用正则表达式实现此目的?我想到这样的事情:

str = Regex.Replace(str, @"\.+", ".", RegexOptions.Multiline).Trim(); 

尝试过,不起作用。

5 个答案:

答案 0 :(得分:2)

如果点之间有空格,就像问题所示,请尝试:

str = Regex.Replace(str, @"[\. ]*\. *", ".", RegexOptions.Multiline)

这将转换任何点和空格的字符串,包括至少一个点。

". . .First" => ".First"
" . . First" => ".First"
" ... First" => ".First"
".   .First" => ".First"
"     First" => "     First"

答案 1 :(得分:1)

Regex.Replace(input, @"(?<=(.))\1+", "");

请参阅 this demo


更新 (基于问题更新)

Regex.Replace(input, @"((\s)?(\S)(?(2)|\s))\1+\s?", "$3");

请参阅 this demo

答案 2 :(得分:0)

您是否尝试过使用反向引用?

取决于您的正则表达式引擎,如下所示:(.)(\1)+

一个角色(如果你只想要点,这样说 - 但这应该是显而易见的怎么做),然后至少还有一个这样的副本。用\1替换字符串 - 第一组的结果 - 它应该有效。对perl来说绝对有用:

$ perl -pe 's/(.)(\1)+/\1/g'
aaa bbb   ccc def abbc
a b c def abc

任何重复的字符都只替换为第一次出现。

答案 3 :(得分:0)

根据您最近的(并且希望是正确的)修订版:

Regex.Replace(
   ". . . . First. . . Second. . . . . . Third. . .", 
   @"(?: *\. *)+", 
   ".", 
   RegexOptions.Multiline)
.Trim() 

答案 4 :(得分:0)

也尝试这个:

Regex.Replace(input, "[. ]+(?=[^ .])?",".");

此模式将查找字符“。”和“”除非后面跟着这两个人以外的其他人物。