正则表达式以应用退格字符

时间:2013-05-17 08:19:41

标签: c# regex

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

这基本上是How can we match a^n b^n with Java regex?的变体,所以我们可以在那里重用它的答案:

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

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

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

(这意味着:

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

答案 1 :(得分:3)

我不会尝试使用正则表达式,因为它非常难以阅读,我觉得它甚至不可能使用普通的正则表达式而没有任何类似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)

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