Выражение Regex groups не захватывает контент - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь создать большое выражение регулярного выражения, где планируется захват 6 групп. Будет использоваться для анализа некоторого Android журнала, который имеет следующий формат:

2020-03-10T14:09:13.3250000 VERB    CallingClass    17503   20870   Whatever content: this log line had (etc)

Выражение, которое я создал до сих пор, выглядит следующим образом:

    (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})\t([A-Za-z]{4})\t(\w{+})\t(\d{5})\t(\d{5})\t(.*$)

Строки в в этом случае табуляция разделена, хотя разрабатываемое мной приложение будет динамическим c до такой степени, что это не всегда так, поэтому я считаю, что регулярное выражение по-прежнему является лучшим вариантом, даже если оно тяжелее, чем выполнение разбиения.

Разбивка групп более подробно из моего процесса мышления:

  1. Соответствует дате (вместо этого я рассматриваю изменение на число символов топора)

    (\ d {4} - \ d {2} - \ d {2} Т \ д {2}: \ д {2}: \ д {2} \ d {7}.)

  2. Соответствует блоку из 4 символов

    ([A-Za-z] {4})

  3. Соответствует любому количеству символов до следующая вкладка

    (\ w {+})

  4. Соответствует блоку из 5 чисел 2 раза

    \ t (\ d {5} )

  5. Наконец, сопоставьте все остальное до конца строки. \ t (. * $)

Если я использую сокращенное выражение для следующего, это работает:

    (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})\t([A-Za-z]{4})\t(.*$)

Это не включает 3 из групп, слово и 2 номера блоков.

Есть идеи, почему это так?

Спасибо.

1 Ответ

3 голосов
/ 15 апреля 2020

Проблема в том, что \w{+} будет соответствовать символу слова, за которым следует один или несколько символов {и затем последний символ}. Если вам нужен один или несколько символов слова, просто используйте плюс без фигурных скобок (которые предназначены для указания определенного числа или диапазона чисел c, но будут соответствовать буквенным фигурным скобкам, если они не придерживаются этого формата).

(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})\t([A-Za-z]{4})\t(\w+)\t(\d{5})\t(\d{5})\t(.*$)

Я настоятельно рекомендую использовать https://regex101.com/ для объяснения, чтобы увидеть, совпадает ли ваше выражение с тем, что вы хотите изложить в словах. Однако для тестирования для использования в C# вы должны использовать что-то еще, например http://regexstorm.net/tester

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...