c# – 应用退格符的正则表达式

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

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

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

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

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

最佳答案
这基本上是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)(?!))");

(这意味着:

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

)

转载注明原文:c# – 应用退格符的正则表达式 - 代码日志