regex 正则表达式,用于在字符串开头的每个短划线中添加空格

brvekthn  于 2023-03-09  发布在  其他
关注(0)|答案(3)|浏览(199)
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);
fkvaft9z

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#恰好具有这种引擎。否则,上述正则表达式无法移植到不支持这种引擎的平台。

kupeojn6

kupeojn62#

一种方法可以是负向后查找,以检查在破折号前添加空格的字符也不是破折号:

@"(?<![^-].*)-"
  • (?<!-负后视开始
  • [^-]-除-以外的任何字符
  • .*-零个或多个任意字符
  • )-负后视结束
  • --文字-

全局匹配并替换为-(破折号+空格)
Demo
删除添加的空格以恢复原始空格可以用类似的方法完成:

@"(?<![^- ].*)- "

全局匹配并替换为-(破折号)。
Demo

tktrz96b

tktrz96b3#

在C#中,你可以使用\G锚来Assert上一个匹配的结尾或字符串的开头:

\G-

在替换中,使用-,或者可以使用完全匹配,后跟空格,如$0
请参见.NET regex demoC# demo

var input = "---Three dashes a-b-c-d";
string result = Regex.Replace(input, @"\G-", "- ");
Console.WriteLine(result);

产出

- - - Three dashes a-b-c-d

如果你想把它改回原来的样子,你可以重新添加匹配的空格:
\G-
在更换用途方面,只可─
参见另一个.NET regex demo

var input = "- - - Three dashes a-b-c-d";
string result = Regex.Replace(input, @"\G- ", "-");
Console.WriteLine(result);

产出

---Three dashes a-b-c-d

相关问题