C# 要应用退格字符的正则表达式

C# 要应用退格字符的正则表达式,c#,regex,C#,Regex,我有一个来自telnet客户端的字符串。此字符串包含我需要应用的退格字符。每个退格都应删除一个以前键入的字符 我正在尝试使用正则表达式在单个替换中执行此操作: string txt = "Hello7\b World123\b\b\b"; txt = Regex.Replace(txt, ".\\\b", "", RegexOptions.ECMAScript); 结果是“Hello World12”。当然,我也希望删除“12”,但它显然与我的表达式不匹配 在某种程度上,它应该重复替换,直到不

我有一个来自telnet客户端的字符串。此字符串包含我需要应用的退格字符。每个退格都应删除一个以前键入的字符

我正在尝试使用正则表达式在单个替换中执行此操作:

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)(?!)”);
(这意味着:

  • 匹配一个或多个非退格,将其命名为“L”
  • 然后在一个或多个退格之后,将它们命名为“R”,条件是每个“R”必须有一个对应的“L”
  • 如果还有任何“L”,则放弃匹配(因为
    (?!)
    不匹配任何内容)

  • )

    @WouterHuysentruit:我迭代输入字符串并操作堆栈。+1我明白了,谢谢。虽然我更喜欢这种方法的可读性,但我必须选择KennyTM的答案,因为我明确要求使用正则表达式。那么:从哪里可以得到您要求的内容和十几条注释?为什么这是个坏主意!嗯,我们目前的代码看起来很像你的建议。但我想知道如何用一个正则表达式来实现这一点,我自己也不知道。这就是我提出问题的原因。伪代码中有一个bug:如果堆栈为空,则您正在将backspace字符推到堆栈上。:)在正则表达式中,
    \b
    不是表示分词吗?如果确实要匹配
    \b
    ,则需要转义:
    \\b
    @BuhBuh:
    \b
    位于字符类内,这意味着
    \u0008
    。看,酷,我不知道。谢谢
    var regex = new Regex(@"(?<L>[^\b])+(?<R-L>[\b])+(?(L)(?!))");