Возвращает имя и значение именованной группы захвата одного регулярного выражения
У меня есть этот класс Tokinizer, который разбивает строковый ввод:
public class Tokinizer
{
public static Regex r = new Regex(
"(?<Equals>=)" +
"|(?<Plus>\\+)" +
"|(?<Minus>\\-)" +
"|(?<Divide>\\/)" +
"|(?<Multiply>\\*)" +
"|(?<Exclamation>\\!)" +
"|(?<GreaterThan>\\>)" +
"|(?<SmallerThan>\\<)" +
"|(?<OpenParenthesis>\\()" +
"|(?<CloseParenthesis>\\))" +
"|(?<OpenBracket>\\[)" +
"|(?<CloseBracket>\\])" +
"|(?<OpenBrace>\\{)" +
"|(?<CloseBrace>\\})" +
"|(?<Colon>\\:)" +
"|(?<SemiColon>\\;)" +
"|(?<Comma>\\,)" +
"|(?<FullStop>\\.)" +
"|(?<Quatation>\\\")" +
"|(?<Char>[a-zA-Z0-9])" +
"|(?<space>\\s+)", RegexOptions.ExplicitCapture);
public static void GetTokens(string input)
{
foreach (var t in r.Matches(input))
{
Console.WriteLine("Named Group : Token Value");
}
}
Я хочу распечатать имя группы захвата, а также значение из списка совпадений, возможно ли это сделать?
Например, когда я ввожу "var++", он должен выводить:
Char : v
Char : a
Char : r
Plus : +
Plus : +
1 ответ
Решение
Вы можете использовать Regex.GroupNameFromNumber
public static void GetTokens(string input)
{
foreach (Match match in r.Matches(input))
{
for (int i = 1; i < match.Groups.Count; i++)
{
var group = match.Groups[i];
if (group.Success){
Console.WriteLine("{0} : {1}", r.GroupNameFromNumber(i), match);
break;
}
}
}
}