В большинстве разновидностей регулярных выражений ( и в. Net версии ) есть шаблон условный , который позволяет выполнять проверку, например if...then...else
. Это выполняется с помощью (?({conditon})X|Y)
, где, если условие совпадения истинно, выполняется X
, а если нет , то выполняется Y
).
Проверьте это, выполнив это ( обратите внимание, включите флаг IgnorePatternWhitespace
, потому что я комментирую регулярное выражение ):
(?(?:.+-) # If a dash
(?<A>.+) # Match for dash
| # Else Then
(?<B>.+) # Match this
)
Таким образом, условие является предварительным что означает ?:.+-
, что означает, что где-то впереди есть -
. Если true, сопоставьте и создайте именованную группу захвата A
. В противном случае создайте соответствие для группы B
.
Итак, взяв ваш образец, мы можем выделить его и просто сосредоточиться на -
. Например,
https://
(?(?:.+-) # If a dash
(
(?<tenantName>[^-]+)-(?<environment>[^.]+)
)
| # Else Then
(
(?<tenantName>[^.]+)
)
)
\.(?<rootDomain>[^/]+)
Итак, если мы сбрасываем совпадение, когда есть -
, профиль групп в совпадении выглядит следующим образом:
Match #0
[0]: https://tenantName-dev.somedomain.com
["1"] → [1]:
["2"] → [2]:
["tenantName"] → [3]: tenantName
→3 Captures: tenantName
["environment"] → [4]: dev
→4 Captures: dev
["rootDomain"] → [5]: somedomain.com
→5 Captures: somedomain.com
Обратите внимание, что приведенные выше индексы действительны для [3]
или лучше использовать именованный захват ["tenantName"]
, который дает нам «tenantName» и ["environment"]
, который дает нам «dev».
Выньте -dev
, и дамп совпадений будет выглядеть так :
Match #0
[0]: https://tenantName.somedomain.com
["1"] → [1]: tenantName
→1 Captures: tenantName
["2"] → [2]:
["tenantName"] → [3]: tenantName
→3 Captures: tenantName
["environment"] → [4]:
["rootDomain"] → [5]: somedomain.com
→5 Captures: somedomain.com
Для этой группы ["environment"]
не отображается, и мы можем проверить Success
как mtch.Groups["Dev"].Success
. Пример:
var pattern = @"https://
(?(?:.+-) # If a dash
(
(?<tenantName>[^-]+)-(?<environment>[^.]+)
)
| # Else Then
(
(?<tenantName>[^.]+)
)
)
\.(?<rootDomain>[^/]+)";
var url = "https://tenantName.somedomain.com/somefile.js";
var mtch = Regex.Match(url, pattern, RegexOptions.IgnorePatternWhitespace);
if (mtch.Groups["Dev"].Success)
...