可以说我有这样的事情:
. . . . 第一的 。. 第二。. . . . 第三 。. .
所需的输出是:
.First.Second.Third.
如何通过使用正则表达式来实现这一点?我想到了这样的事情:
str = Regex.Replace(str, @"\.+", ".", RegexOptions.Multiline).Trim();
试过了,不行。
如果您在点之间有空格,就像您在问题中出现的那样,请尝试:
str = Regex.Replace(str, @"[\. ]*\. *", ".", RegexOptions.Multiline)
这将转换任何点和空格字符串,包括至少一个点。
“. . .First” => “.First” “ . . First” => “.First” “ ... 第一” => “.First” "..First" => ".First" “第一”=>“第一”
您是否尝试过使用反向引用?
根据您的正则表达式引擎,如下所示:(.)(\1)+
一个字符(如果你只想要点,就这么说吧——但这应该是显而易见的),然后至少再复制一份。将字符串替换为\1
- 第一组的结果 - 它应该可以工作。使用 perl 肯定对我有用:
$ perl -pe 's/(.)(\1)+/\1/g'
aaa bbb ccc def abbc
a b c def abc
任何重复的字符只替换为第一次出现。
根据您最近的(并且希望是正确的)修订:
Regex.Replace(
". . . . First. . . Second. . . . . . Third. . .",
@"(?: *\. *)+",
".",
RegexOptions.Multiline)
.Trim()
也试试这个:
Regex.Replace(input, "[. ]+(?=[^ .])?",".");
此模式将查找字符“。” 和 " " 除非它后面跟着除这两个以外的其他字符。