Вы можете использовать шаблон, содержащийся в этой строке:
@"(""[^""]*""|[a-z]|\d+)"
для токенизации введенной вами строки. Этот шаблон захватывает три вещи: простые строки в кавычках (без встроенных кавычек), символы нижнего регистра и одна или несколько цифр.
Если у ваших строк в кавычках могут быть экранированные кавычки (например, "Hi\"There\"""OK""Pilgrim"
), то вы можете использовать этот шаблон для захвата и токенизации их вместе с остальной частью входной строки:
@"((?:""[^""\\]*(?:\\.[^""\\]*)*"")|[a-z]|\d+)"
Вот пример:
MatchCollection matches = Regex.Matches(@"abc20a""Hi\""There\""""""OK""""Pilgrim""100,20b", @"((?:""[^""\\]*(?:\\.[^""\\]*)*"")|[a-z]|\d+)");
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
Возвращает строковые токены:
a
b
c
20
a
"Hi\"There\""
"OK"
"Pilgrim"
100
20
b
Одна из приятных особенностей этого подхода заключается в том, что вы можете просто проверить первый символ, чтобы увидеть, в какой стек нужно поместить ваши элементы. Если первый символ является альфа-каналом, то он переходит в стек ProcessLetters, если символ числовой, затем он переходит в ProcessInts. Если первый символ - это кавычка, то он уходит в ProcessStrings после обрезания начальных и конечных кавычек и вызова Regex.Unescape()
, чтобы отменить скрытые кавычки.