using System;
using System.Collections .Generic ;
using System.Text .RegularExpressions ;
using System.Linq ;
public class Test
{
public static void Main( )
{
var tests = new List< string> { "<backspace>это буу<backspace>дка<backspace><backspace>ет тек<backspace>стовыыф<backspace><backspace>й ткаукц<backspace><backspace><backspace><backspace><backspace>екст" ,
"Это<backspace><backspace><backspace><backspace><backspace><backspace>" ,
"a<backspace><backspace><backspace>b" ,
"<backspace><backspace><backspace><backspace>" ,
"ab<backspace>c<backspace><backspace>d" } ;
foreach( var test in tests)
Console.WriteLine ( "'{0}'" , Rx.backspaceRx .Replace ( test, string.Empty ) ) ;
}
public static class Rx
{
public static readonly Regex backspaceRx = new Regex(
@"^(?:<backspace>)+ # 1+ <backspace> в начале
| # или
(?:
(?<t>(?<!<backspace).) # Любой символ, перед которым нет <backspace
| # или
(?<-t><backspace>) # <backspace>
)+ # 1 или более раз
(?(t)(?!)) # проверка стека группы t
(?:<backspace>)* # 0+ <backspace>" ,
RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace ) ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwp1c2luZyBTeXN0ZW0uTGlucTsKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCXZhciB0ZXN0cyA9IG5ldyBMaXN0PHN0cmluZz4geyI8YmFja3NwYWNlPtGN0YLQviDQsdGD0YM8YmFja3NwYWNlPtC00LrQsDxiYWNrc3BhY2U+PGJhY2tzcGFjZT7QtdGCINGC0LXQujxiYWNrc3BhY2U+0YHRgtC+0LLRi9GL0YQ8YmFja3NwYWNlPjxiYWNrc3BhY2U+0Lkg0YLQutCw0YPQutGGPGJhY2tzcGFjZT48YmFja3NwYWNlPjxiYWNrc3BhY2U+PGJhY2tzcGFjZT48YmFja3NwYWNlPtC10LrRgdGCIiwKCQkJItCt0YLQvjxiYWNrc3BhY2U+PGJhY2tzcGFjZT48YmFja3NwYWNlPjxiYWNrc3BhY2U+PGJhY2tzcGFjZT48YmFja3NwYWNlPiIsCgkJCSJhPGJhY2tzcGFjZT48YmFja3NwYWNlPjxiYWNrc3BhY2U+YiIsCgkJCSI8YmFja3NwYWNlPjxiYWNrc3BhY2U+PGJhY2tzcGFjZT48YmFja3NwYWNlPiIsCgkJCSJhYjxiYWNrc3BhY2U+YzxiYWNrc3BhY2U+PGJhY2tzcGFjZT5kIiB9OwoJCWZvcmVhY2godmFyIHRlc3QgaW4gdGVzdHMpCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCInezB9JyIsIFJ4LmJhY2tzcGFjZVJ4LlJlcGxhY2UodGVzdCwgc3RyaW5nLkVtcHR5KSk7CgkJCgl9CgkKCXB1YmxpYyBzdGF0aWMgY2xhc3MgUngKCXsKCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJlZ2V4IGJhY2tzcGFjZVJ4ID0gbmV3IFJlZ2V4KAoJCQlAIl4oPzo8YmFja3NwYWNlPikrICAgICAgICAgICMgMSsgPGJhY2tzcGFjZT4g0LIg0L3QsNGH0LDQu9C1CgkJCSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIyDQuNC70LgKCQkJICAgKD86CgkJCSAgICAgKD88dD4oPzwhPGJhY2tzcGFjZSkuKSAgIyDQm9GO0LHQvtC5INGB0LjQvNCy0L7Quywg0L/QtdGA0LXQtCDQutC+0YLQvtGA0YvQvCDQvdC10YIgPGJhY2tzcGFjZSAKCQkJICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAjINC40LvQuAoJCQkgICAgICg/PC10PjxiYWNrc3BhY2U+KSAgICAgICMgPGJhY2tzcGFjZT4KCQkJICAgKSsgICAgICAgICAgICAgICAgICAgICAgICAjIDEg0LjQu9C4INCx0L7Qu9C10LUg0YDQsNC3CgkJCSAgICg/KHQpKD8hKSkgICAgICAgICAgICAgICAgIyDQv9GA0L7QstC10YDQutCwINGB0YLQtdC60LAg0LPRgNGD0L/Qv9GLIHQKCQkJICAgKD86PGJhY2tzcGFjZT4pKiAgICAgICAgICAjIDArIDxiYWNrc3BhY2U+IiwKCQkJUmVnZXhPcHRpb25zLkNvbXBpbGVkIHwgUmVnZXhPcHRpb25zLlNpbmdsZWxpbmUgfCBSZWdleE9wdGlvbnMuSWdub3JlUGF0dGVybldoaXRlc3BhY2UpOwoJfQp9Cg==