英文:
Regular Expression to add space to each dash at the beginning of string
问题
以下是您要的翻译结果:
var input = "---Three dashes a-b-c-d";
通过正则表达式获取
var output = "- - - Three dashes a-b-c-d";
并且通过正则表达式将其还原,删除开头的额外空格。output => input
不使用正则表达式的代码 输入 => 输出
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);
英文:
var input = "---Three dashes a-b-c-d";
Regex to get
var output = "- - - Three dashes a-b-c-d";
and Regex get back to original, added spaces are deleted at the beginning. output => input
Code without Regex input => output
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);
答案1
得分: 3
@TedLyngmo的解决方法虽然有效,但在回溯模式中使用通配符效率较低。
更高效的方法是使用正向回溯模式来确保只有短横线在匹配之前:
@(?<=^-+)
然后用空格替换匹配项。
在regex101上,上述正则表达式运行时间为0.2毫秒,而@TedLyngmo的运行时间为19.5毫秒。
演示链接:https://regex101.com/r/6uy1K8/3
用于移除添加的空格以恢复原始文本的正则表达式(带有尾随空格):
@(?<=(?:- )*-)
然后将匹配项替换为空。
在regex101上,上述正则表达式运行时间为0.3毫秒,而@TedLyngmo的运行时间为28.1毫秒。
请注意,所需的行为需要支持可变宽度回溯的正则表达式引擎,幸运的是,C#恰好支持这一功能。否则,上述正则表达式在不支持此功能的平台上无法使用。
英文:
While @TedLyngmo's solution works, it is rather inefficient with a wild card in the lookbehind pattern.
A more efficient approach would be to use a positive lookbehind pattern to assert that only dashes precede a match:
@"(?<=^-+)"
And substitute the match with a space.
On regex101, the above regex took 0.2ms to run while @TedLyngmo's took 19.5ms.
Demo: https://regex101.com/r/6uy1K8/3
Regex (with a trailing space) to remove the added spaces to get back the original:
@"(?<=^(?:- )*-) "
<sup>Note the space at the end</sup>
And substitute the match with nothing.
On regex101, the above regex took 0.3ms to run while @TedLyngmo's took 28.1ms.
Demo: https://regex101.com/r/fBOirM/3
Note that the desired behaviors require a regex engine that supports variable-width lookbehind, which C# happens to have. The above regexes are otherwise not portable to platforms that do not have such a support.
答案2
得分: 1
代码翻译如下:
一种方法是使用负回顾断言来检查破折号前面没有字符,只有破折号之前有空格:
@"(?<![^-].*)-"
(?<!
- 开始负回顾断言[^-]
- 除了破折号之外的任何字符.*
- 零个或多个任何字符
)
- 结束负回顾断言-
- 字面上的破折号
全局匹配并替换为-
(破折号 + 空格)
要去掉添加的空格以恢复原始文本,可以使用类似的方法:
@"(?<![^- ].*)- "
全局匹配并替换为-
(破折号)。
英文:
One way could be a negative lookbehind to check that no character before a dash to add a space too is anything but a dash:
@"(?<![^-].*)-"
(?<!
- start of negative lookbehind[^-]
- any character but-
.*
- zero or more of any character
)
- end of negative lookbehind-
- a literal-
Match globally and substitute with -
(dash + space)
Removing the added spaces to get the original back could be done in a similar way:
@"(?<![^- ].*)- "
Match globally and substitute with -
(dash).
答案3
得分: 1
在C#中,您可以使用\G锚点来断言在先前匹配的结束位置或字符串的开头位置:
\G-
在替换部分使用-
,或者您可以使用完整的匹配,后跟一个空格,例如$0
查看 .NET正则表达式演示 和 C#演示。
var input = "---三个短线 a-b-c-d";
string result = Regex.Replace(input, @"\G-", "- ");
Console.WriteLine(result);
输出:
- - - 三个短线 a-b-c-d
如果您想将其更改回原始状态,您可以再次匹配空格:
\G-
在替换部分只使用-
查看另一个 .NET正则表达式演示。
var input = "- - - 三个短线 a-b-c-d";
string result = Regex.Replace(input, @"\G- ", "-");
Console.WriteLine(result);
输出:
---三个短线 a-b-c-d
英文:
In C# you can use the \G anchor to assert the position at the end of the previous match or at the start of the string:
\G-
In the replacement use -
or you can use the full match followed by a space like $0
See a .NET regex demo and a C# demo.
var input = "---Three dashes a-b-c-d";
string result = Regex.Replace(input, @"\G-", "- ");
Console.WriteLine(result);
Output
- - - Three dashes a-b-c-d
<hr>
If you want to change it back to the original, you can add matching the space again:
\G-
In the replacement use just -
See another .NET regex demo.
var input = "- - - Three dashes a-b-c-d";
string result = Regex.Replace(input, @"\G- ", "-");
Console.WriteLine(result);
Output
---Three dashes a-b-c-d
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论