1 .: Условные выражения работают в .NET так же, как в PHP.
2 .: «Более простое» регулярное выражение подходит для .NET. Вы просто используете это неправильно:
В вашем регулярном выражении нет групп захвата. Это означает, что цикл
for (int i = 1; i < m.Groups.Count; i++) {...}
никогда не выполняется, потому что m.Groups.Count
равно 1.
Правильный путь будет что-то вроде
foreach (Match m in re.Matches(data))
{
if (m.Success)
{
for (int i = 0; i < m.Groups.Count; i++) // Groups are numbered from zero
{
// Groups[0] is the entire match
Console.WriteLine("[{0}][{1}]", i, m.Groups[i].Value);
}
}
}
3 .: В вашем регулярном выражении отсутствуют одинарные кавычки.
Regex regexObj = new Regex(@"(\d{13,16})(?(?=<)<|[""']).*?(?=(?(?=>)>|[""'])\d{3,4}(?(?=<)<|[""']))(?(?=>)>|[""'])(\d{3,4})(?(?=<)<|[""'])", RegexOptions.Singleline);
будет буквальный перевод.
4 .: Вам не нужен параметр /i
или Ignorecase
, так как в вашем регулярном выражении нет букв.
5 .: (?(?=<)<|["'])
не имеет смысла. Он совпадает с тем же текстом, что и [<"']
. В конце концов это означает «если есть <
, то соответствует <
. В противном случае, попробуйте сопоставить "
или '
. Нет необходимости использовать условное регулярное выражение вообще.
Таким образом, все регулярное выражение может быть упрощено до
(\d{13,16})[<"'].*?(?=[>"']\d{3,4}[<"'])[>"'](\d{3,4})[<"']
6 .: Это более четко показывает еще одну лишнюю часть регулярного выражения: у вас есть предварительное утверждение (?=[>"']\d{3,4}[<"'])
, за которым следует точно такое же регулярное выражение [>"'](\d{3,4})[<"']
, поэтому его можно полностью отбросить.
Конечный результат:
(\d{13,16})[<"'].*?[>"'](\d{3,4})[<"']
или, в C #:
Regex regexObj = new Regex(@"(\d{13,16})[<""'].*?[>""'](\d{3,4})[<""']", RegexOptions.Singleline);