var input = "---Three dashes a-b-c-d";
要获取的正则表达式
var output = "- - - Three dashes a-b-c-d";
和Regex返回到原始值,添加的空格在开始时被删除。output =〉input
没有Regex输入的代码=〉输出
var input = "---Three dashes a-b-c-d";
var output = "";
var i = 0;
while (i < input.Length && input[i] == '-')
{
output += "- ";
i++;
}
output += input.Substring(i);
3条答案
按热度按时间fkvaft9z1#
虽然@TedLyngmo的解决方案可以工作,但是在lookbehind模式中使用通配符会导致效率相当低。
一种更有效的方法是使用肯定的lookbehind模式来Assert在匹配之前只有破折号:
并将匹配替换为空格。
在regex101上,上面的正则表达式运行时间为0.2ms,而@TedLyngmo的运行时间为19.5ms。
演示:https://regex101.com/r/6uy1K8/3
正则表达式(带尾随空格)删除添加的空格以恢复原始值:
注意结尾处的空格
把比赛替换成空的。
在regex101上,上面的正则表达式运行时间为0.3ms,而@TedLyngmo的运行时间为28.1ms。
演示:https://regex101.com/r/fBOirM/3
请注意,所需的行为需要一个支持可变宽度lookbehind的正则表达式引擎,而C#恰好具有这种引擎。否则,上述正则表达式无法移植到不支持这种引擎的平台。
kupeojn62#
一种方法可以是负向后查找,以检查在破折号前添加空格的字符也不是破折号:
(?<!
-负后视开始[^-]
-除-
以外的任何字符.*
-零个或多个任意字符)
-负后视结束-
-文字-
全局匹配并替换为
-
(破折号+空格)Demo
删除添加的空格以恢复原始空格可以用类似的方法完成:
全局匹配并替换为
-
(破折号)。Demo
tktrz96b3#
在C#中,你可以使用\G锚来Assert上一个匹配的结尾或字符串的开头:
在替换中,使用
-
,或者可以使用完全匹配,后跟空格,如$0
请参见.NET regex demo和C# demo。
产出
如果你想把它改回原来的样子,你可以重新添加匹配的空格:
\G-
在更换用途方面,只可─
参见另一个.NET regex demo。
产出