让我们说我有这样的事情:
. . . . First . . Second. . . . . Third . . .
所需的输出是:
.First.Second.Third.
如何使用正则表达式实现此目的?我想到这样的事情:
str = Regex.Replace(str, @"\.+", ".", RegexOptions.Multiline).Trim();
尝试过,不起作用。
答案 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, "[. ]+(?=[^ .])?",".");
此模式将查找字符“。”和“”除非后面跟着这两个人以外的其他人物。