我有来自telnet客户端的字符串。该字符串包含我需要应用的退格字符。每个退格键应删除一个以前键入的字符。
我正在尝试使用正则表达式在单个替换中执行此操作:
string txt = "Hello7\b World123\b\b\b";
txt = Regex.Replace(txt, ".\\\b", "", RegexOptions.ECMAScript);
导致“Hello World12”。当然,我也希望删除“12”,但它显然与我的表达不符。
在某种程度上,它应该重复替换,直到没有更多匹配。有关如何使用单个正则表达式实现此目的的任何想法?
答案 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 :(得分: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)
立即清楚发生了什么以及它是如何工作的。