Regex назвал проблему группы C # - PullRequest
0 голосов
/ 09 октября 2009

Я пытаюсь написать регулярное выражение с именованными перехватами в C # для разбора заданий cron. Проблема, однако, заключается в том, что при использовании одинарной кавычки и именованных групп захвата значения возвращаются пустыми. Например, с помощью ввода

* / 15 * * * * * http://www.google.com/

этот код:

Regex cronRe = new Regex(@"(?<minutes>[\d\*\-,]+) (?<hours>[\d\*\-,]+) (?<days>[\d\*\-,]+) (?<months>[\d\*\-,]+) (?<dotw>[\d\*\-,]+) (?<years>[\d\*\-,]+) (?<command>[\d\*\-,]+)");

//loop through jobs and do them
for (int i = 0; i < lines.Length; i++)
{
    Match line = logRe.Match(lines[i]);
    bool runJob = true;
    for (int j = 0; j < line.Groups.Count; j++)
    {
        Console.Write(j.ToString() + ": " + line.Groups[j].Value + "\n");
    }
    Console.Write("named group minutes: " + line.Groups["minutes"].Value);
}

возврат с этим:

0: * / 15 * * * * * http://www.google.com
1: * / 15 *
2: * 3: *
4: *
5: *
6: http://www.google.com
минуты именованной группы:

есть предложения?

1 Ответ

5 голосов
/ 09 октября 2009

Я полагаю, что вы хотите что-то вроде этого (для удобства чтения):

^
(?<minutes>[\d*,/-]+)\s
(?<hours>[\d*,/-]+)\s
(?<days>[\d*,/-]+)\s
(?<months>[\d*,/-]+)\s
(?<dotw>[\d*,/-]+)\s
(?<years>[\d*,/-]+)\s
(?<command>.*)
$

Примечания:

  • Выражение должно быть правильно закреплено (хотя бы "^").
  • Тире имеет особое значение в классах символов (создает диапазоны). Если вы хотите соответствовать буквальному тире, поместите его в конец класса символов.
  • Вам не нужно убегать от звезды в классах персонажей.

Кроме того: выражение ([\d*,/-]+) довольно неопределенно. Я бы сделал это с большей проверкой ввода:

(\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*(?:,\*)?|\*(?:/\d+)?)

Объяснение

(
  \d+                 // matches numbers ("3")
  (?:-\d+)?           // with the above: matches ranges ("3-4")
  (?:                 // optional
    ,\d+              // matches more numbers ("3,6")
    (?:-\d+)?         // matches more ranges ("3,6-9")
  )*                  // allows repeat ("3,6-9,11")
  (?:,\*)?            // allows star at the end ("3,6-9,11,*")
  |                   // alternatively...
  \*(?:/\d+)?         // allows star with optional filter ("*" or "*/15")
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...