C# Как сопоставить обязательный текст с регулярным выражением? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть строка "{Binding Name,Mode=TwoWay,FallbackValue='Johan'}", и я хотел бы найти "Name", "TwoWay", "'Johan'" с помощью регулярных выражений.

Теперь мой код ниже:

Regex r = new Regex("\\s*\\{\\s*Binding\\s+(\\S+)?\\s*,\\s*Mode\\s*=\\s*(\\S+)?(\\s*,\\s*FallbackValue\\s*=\\s*(\\S+)?)?\\s*\\}\\s*");
string testvalue = "{Binding Name,Mode=TwoWay,FallbackValue='Johan'}";
Match m = r.Match(testvalue);

Но результат совпадения:

m.Groups[1].Value===>"Name"
m.Groups[2].Value===>"TwoWay,FallbackValue='Johan'"
m.Groups[3].Value===>""

Так в чем же проблема? Можете ли вы порекомендовать мне лучшее регулярное выражение?

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Это регулярное выражение, которое я бы использовал:

Regex r = new Regex(@
    "{\s*Binding\s+(?<name>.+)\s*,\s*Mode\s*=(?<mode>.+)\s*,\s*FallbackValue\s*=\s*'(?<fallback>.+)'\s*}"
);
0 голосов
/ 11 февраля 2020

Вы сделали последнюю группу необязательной, удалите ? в конце:

Regex r = new Regex("\\s*\\{\\s*Binding\\s+(\\S+)?\\s*,\\s*Mode\\s*=\\s*(\\S+)?(\\s*,\\s*FallbackValue\\s*=\\s*(\\S+)?)\\s*\\}\\s*");
#                                                                                                                  ___^

Если вы хотите, чтобы последняя группа была необязательной, сделайте все слова совпадениями не жадными и добавьте необязательные mark ?

{\\s*Binding\\s+(\\S*)\\s*,\\s*Mode\\s*=\\s*(\\S+?)(?:\\s*,\\s*FallbackValue\\s*=\\s*(\\S*))?\\s*\\}
#                                             ___^                                   and ___^

Если группы 2 (Mode) или 3 (FallbackValue) могут быть необязательными, используйте:

{\s*Binding\s+(\S+?)(?:\s*,\s*Mode\s*=\s*(\S+?))?(?:\s*,\s*FallbackValue\s*=\s*(\S+)?)?\s*\}

Демонстрация и объяснение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...