Как я могу разбить строку на не константы регулярного выражения (C #) - PullRequest
0 голосов
/ 04 июня 2018

Я кодирую Edifact Reader.Файл Edifact состоит из таких строковых строк:

string row = @"ABC+1+E522017332:101111757+MAX:MUSTERMANN:16890224+9'";

Существует набор правил, которые описывают действительную строку, подобную этой.Перевод этого правила в RegEX в данном конкретном случае выглядит следующим образом:

Regex regex = new Regex(@"ABC\+\d{1}([A-Z0-9])?(\:\d{1})?\+[A-Z0-9]{1,12}\:[A-Z0-9]{9}\+[A-Z0-9]{0,45}\:[A-Z0-9]{0,45}\:\d{8}\+\d{1}(\d{4})?(\d{1})?([A-Z0-9]{1,7})?([A-Z0-9]{3})?([A-Z0-9]{15})?\'");

И это прекрасно работает.Но я также хочу разбить эту строку соответственно на не константы в RegEx.Результат должен выглядеть следующим образом:

ABC 
1
null
null
E522017332
101111757
MAX
MUSTERMANN
16890224
9
null
null
null
null
null

Как я могу это сделать?

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете использовать группы захвата (...) для всех необходимых вам фигур:

Regex regex = new Regex(@"^(ABC)\+(\d{1})([A-Z0-9])?(\:\d{1})?\+([A-Z0-9]{1,12})\:([A-Z0-9]{9})\+([A-Z0-9]{0,45})\:([A-Z0-9]{0,45})\:(\d{8})\+(\d{1})(\d{4})?(\d{1})?([A-Z0-9]{1,7})?([A-Z0-9]{3})?([A-Z0-9]{15})?\'$");

string row = @"ABC+1+E522017332:101111757+MAX:MUSTERMANN:16890224+9'";

var match = regex.Match(row);

if (match.Success)
{
    for (int i = 1; i < match.Groups.Count; i++)
    {
        string value = match.Groups[i].Value;
        if (value == string.Empty)
        {
            value = "(null)";
        }
        Console.WriteLine(value);
    }
}

Теперь Groups пронумерованы 1 ... много.Но это совершенно нечитаемо ... Вы могли бы дать явные имена:

Regex regex = new Regex(@"^(?<abc>ABC)\+(?<digit0>\d{1})(?<lettersdigits0>[A-Z0-9])?(\:\d{1})?\+([A-Z0-9]{1,12})\:([A-Z0-9]{9})\+([A-Z0-9]{0,45})\:([A-Z0-9]{0,45})\:(\d{8})\+(\d{1})(\d{4})?(\d{1})?([A-Z0-9]{1,7})?([A-Z0-9]{3})?([A-Z0-9]{15})?\'$");

string row = @"ABC+1+E522017332:101111757+MAX:MUSTERMANN:16890224+9'";

var match = regex.Match(row);

if (match.Success)
{
    {
        string value = match.Groups["abc"].Value;
        if (value == string.Empty)
        {
            value = "(null)";
        }
        Console.WriteLine(value);
    }

    {
        string value = match.Groups["digit0"].Value;
        if (value == string.Empty)
        {
            value = "(null)";
        }
        Console.WriteLine(value);
    }
}

Возможно имена лучше, чем abc, digit0, letterdigit0 :-) Имена, которые объясняют, что такое цифра / буква!

...