C# 要应用退格字符的正则表达式
我有一个来自telnet客户端的字符串。此字符串包含我需要应用的退格字符。每个退格都应删除一个以前键入的字符 我正在尝试使用正则表达式在单个替换中执行此操作:C# 要应用退格字符的正则表达式,c#,regex,C#,Regex,我有一个来自telnet客户端的字符串。此字符串包含我需要应用的退格字符。每个退格都应删除一个以前键入的字符 我正在尝试使用正则表达式在单个替换中执行此操作: string txt = "Hello7\b World123\b\b\b"; txt = Regex.Replace(txt, ".\\\b", "", RegexOptions.ECMAScript); 结果是“Hello World12”。当然,我也希望删除“12”,但它显然与我的表达式不匹配 在某种程度上,它应该重复替换,直到不
string txt = "Hello7\b World123\b\b\b";
txt = Regex.Replace(txt, ".\\\b", "", RegexOptions.ECMAScript);
结果是“Hello World12”。当然,我也希望删除“12”,但它显然与我的表达式不匹配
在某种程度上,它应该重复替换,直到不再匹配为止。关于如何用一个正则表达式来实现这一点,有什么想法吗?我不会尝试使用正则表达式来实现这一点,因为它非常难以理解,而且我觉得如果没有任何类似perl的regex magic扩展,使用普通正则表达式是不可能的。我的建议是(类似python的伪代码):
很快就会清楚发生了什么以及它是如何工作的 这基本上是的一个变体,因此我们可以重用它的答案:
var regex = new Regex(@"(?:[^\b](?=[^\b]*((?>\1?)[\b])))+\1");
Console.WriteLine(regex.Replace("Hello7\b World123\b\b\b", ""));
此外,.NET正则表达式引擎还支持,因此我们可以使用不同的模式:
var regex = new Regex(@"(?<L>[^\b])+(?<R-L>[\b])+(?(L)(?!))");
var regex=newregex(@“(?[^\b])+(?[\b])+(?(L)(?!)”);
(这意味着:
(?!)
不匹配任何内容))@WouterHuysentruit:我迭代输入字符串并操作堆栈。+1我明白了,谢谢。虽然我更喜欢这种方法的可读性,但我必须选择KennyTM的答案,因为我明确要求使用正则表达式。那么:从哪里可以得到您要求的内容和十几条注释?为什么这是个坏主意!嗯,我们目前的代码看起来很像你的建议。但我想知道如何用一个正则表达式来实现这一点,我自己也不知道。这就是我提出问题的原因。伪代码中有一个bug:如果堆栈为空,则您正在将backspace字符推到堆栈上。:)在正则表达式中,
\b
不是表示分词吗?如果确实要匹配\b
,则需要转义:\\b
@BuhBuh:\b
位于字符类内,这意味着\u0008
。看,酷,我不知道。谢谢
var regex = new Regex(@"(?<L>[^\b])+(?<R-L>[\b])+(?(L)(?!))");