Регулярное выражение для применения символов возврата

У меня есть строка из клиента telnet. Эта строка содержит символы возврата, которые мне нужно применить. Каждый возврат должен удалять один ранее набранный символ.

Я пытаюсь сделать это в одной замене с помощью регулярного выражения:

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

Что приводит кHello World12 ", Конечно я хочу "12" быть удаленным тоже, но это явно нене соответствует моему выражению.

В некотором смысле, это должно повторять замену, пока не останется больше совпадений. Любые идеи о том, как достичь этого с помощью одного регулярного выражения?

Ответы на вопрос(2)

Решение Вопроса

Это в основном вариантКак мы можем сопоставить ^ n b ^ n с регулярным выражением Java?так что мы могли бы использовать его ответ там:

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

Кроме того, .NET Regex Engine поддерживаетбалансировочные группычтобы мы могли использовать другой шаблон:

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

(Это означает:

Сопоставьте одно или несколько непробелов, присваивая им имя «L»,затем следуют одно или несколько задним числом, присваивая им имя «R»при условии, что каждый "R" должен иметь один соответствующий "L",если есть какие-либо "L"осталось, отменить матч (как(?!) ничего не соответствует).)

 Buh Buh20 мая 2013 г., 12:11
Круто, я нене знаю этого. Благодарю.
 kennytm20 мая 2013 г., 11:27
@BuhBuh:\b находится внутри класса персонажа, что означает\u0008, Увидетьmsdn.microsoft.com/en-us/library/4edbef7e.aspx.
 Buh Buh20 мая 2013 г., 09:43
В регулярных выражениях не\b значит разбить слово? Если вы действительно хотите соответствовать\b вам нужно было бы сбежать.\\b

так какочень трудно читать, и у меня есть ощущение, что этоэто даже невозможно с обычным регулярным выражением без каких-либо магических расширений, подобных Perl. Мое предложение будет что-то вроде (Python, как псевдокод):

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

result = ''.join(stack)

Это'Сразу понятно, что происходит и как это работает.

 huysentruitw17 мая 2013 г., 11:02
Ну, наш текущий код очень похож на ваше предложение. Но мне было интересно, как сделать это с помощью одного регулярного выражения, которое я не могне могу понять сам. Тот'причина моего вопроса.
 Martin Thurau17 мая 2013 г., 10:43
@WouterHuysentruit: я перебираю входную строку и манипулирую стеком.
 Martin Thurau17 мая 2013 г., 10:58
SO: Где взять то, что вы просили, и дюжину комментариев, почему это плохая идея!
 huysentruitw17 мая 2013 г., 10:48
+1 Понятно, спасибо. Хотя я предпочитаю этот метод для удобочитаемости, япридется выбрать KennyTM 's ответ, потому что я явно попросил регулярное выражение.
 huysentruitw18 февр. 2016 г., 07:03
Там'Ошибка в псевдокоде: если стек пуст, вы 'снова нажимаем на клавишу возврата. :)

Ваш ответ на вопрос