Я пытаюсь написать токенизатор для разбора текста (входной строки) с помощью регулярных выражений.Я хочу разделить входные данные по отдельным токенам и сохранить их в списке , где токен является классом (C #), таким как
class Token {
string value;
string type; // "identifier", "string', "intliteral', ...
}
. Я хочу использовать регулярное выражение, подобное приведенному ниже дляразделение входной строки:
public static Regex tokenPattern = new Regex (
@"
( (?<identifier>(?:\p{L}|_)\w*)
| (?<string>""[^""]*"")
| (?<intliteral>(?:-|\+)?\d+[^\.])
| (?<realliteral>(?:-|\+)?\d+(?:\.\d+)?)
| (?<comma>,)
| (?<lpar>\()
| (?<rpar>\))
| ...
| (?<undefined>[^\s]*?)
)
",
RegexOptions.ExplicitCapture |
RegexOptions.IgnorePatternWhitespace |
...
);
Моя проблема в том, что легко получить часть значение каждого токена, но, кажется, нет простого способа получить type part, то есть имя группы.Я ожидал, что у Regex Group будет свойство Name , содержащее «идентификатор» и т. Д., Но это не так.
Есть ли способ определить имя группы безперебирать все имена групп / номера для каждого токена?(то есть подход со сложностью O (n) вместо O (nm), n количество токенов во входной строке, m количество типов токенов)?