-4

可以说我有这样的事情:

. . . . 第一的 。. 第二。. . . . 第三 。. .

所需的输出是:

.First.Second.Third.

如何通过使用正则表达式来实现这一点?我想到了这样的事情:

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

试过了,不行。

4

5 回答 5

2

如果您在点之间有空格,就像您在问题中出现的那样,请尝试:

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

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

“. . .First” => “.First”
“ . . First” => “.First”
“ ... 第一” => “.First”
"..First" => ".First"
“第一”=>“第一”
于 2012-11-28T02:10:22.300 回答
1
Regex.Replace(input, @"(?<=(.))\1+", "");

请参阅此演示


更新 (基于问题更新)

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

请参阅此演示

于 2012-11-28T01:40:33.533 回答
0

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

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

一个字符(如果你只想要点,就这么说吧——但这应该是显而易见的),然后至少再复制一份。将字符串替换为\1- 第一组的结果 - 它应该可以工作。使用 perl 肯定对我有用:

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

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

于 2012-11-28T01:28:02.323 回答
0

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

Regex.Replace(
   ". . . . First. . . Second. . . . . . Third. . .", 
   @"(?: *\. *)+", 
   ".", 
   RegexOptions.Multiline)
.Trim() 
于 2012-11-28T02:00:20.790 回答
0

也试试这个:

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

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

于 2012-11-28T06:16:21.417 回答