Кажется, что вы хотите проверить, если вход состоит из одного из s1|s11|s12
, за которым следует один из s2|s21
и, наконец, один из s3|s31
.
. Вы всегда можете сделать более сложную регулярнуювыражение, которое отражает это, используя:
var complex = "((" + s1 + ")|(" + s11 + ")|(" + s12 + "))|((" + s2 + ")|(" + s21 + ...
и используя это в одном совпадении.
Если вы просто хотите избавиться от вложенных ifs (т.е. если вы хотите рефакторинг, который поддерживаеттекущий поток управления) Я бы сгруппировал регулярные выражения в списки, такие как
var reList = new List<List<string>>() {
new List<string>(){s1, s11, s12},
new List<string>(){s2, s21},
new List<string>(){s3, s31}
};
(используя инициализаторы коллекции C # 3.0)
Затем вы можете перебирать все выражения в двух вложенных циклах, таких как
var i = 0;
foreach (var outer in reList) {
Match mt;
foreach (var inner in outer) {
rg = new Regex(inner, RegexOptions.Multiline | RegexOptions.IgnoreCase);
mt = rg.Match(resultadoEjecucionScriptMsBuild, i);
if (mt.Success)
break;
}
if (!mt.Success)
return false;
i = mt.Index + mt.Length;
}
return true;
Эта функция возвращает true, если входная строка представляет собой конкатенацию одного из s1,s11,s12
, одного из s2, s21
и, наконец, одного из s3, s31
.