正则表达式以应用退格符

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

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

string txt = "Hello7\b World123\b\b\b"; txt = Regex.Replace(txt, ".\\\b", "", RegexOptions.ECMAScript); 

这导致“Hello World12”。 当然,我也希望删除“12”,但它显然与我的表达不符。

在某种程度上,它应该重复替换,直到没有更多的匹配。 有关如何使用单个正则表达式实现此目的的任何想法?

这基本上是我们如何匹配^ nb ^ n与Java正则表达式的变体? ,所以我们可以在那里重用它的答案:

 var regex = new Regex(@"(?:[^\b](?=[^\b]*((?>\1?)[\b])))+\1"); Console.WriteLine(regex.Replace("Hello7\b World123\b\b\b", "")); 

此外,.NET正则表达式引擎支持平衡组 ,因此我们可以使用不同的模式:

 var regex = new Regex(@"(?[^\b])+(?[\b])+(?(L)(?!))"); 

(这意味着:

  1. 匹配一个或多个非退格,为其分配名称“L”,
  2. 然后跟随一个或多个退格,给它们分配名称“R”,条件是每个“R”必须有一个对应的“L”,
  3. 如果剩下任何“L”,则放弃比赛(因为(?!)匹配)。

我不会尝试使用正则表达式,因为它非常难以阅读,我觉得它甚至不可能使用普通的正则表达式而没有任何类似perl的正则表达式魔术扩展。 我的建议是(python like pseudocode):

 stack = [] for char in str: if char == BACKSPACE and not stack.isEmpty(): stack.pop() else: stack.push(char) result = ''.join(stack) 

它立即清楚发生了什么以及它是如何工作的。