Как я могу исправить это RegEx, чтобы дополнительно захватить расширение файла?
Я пытаюсь сопоставить строку с необязательным компонентом, но что-то не так. (Соответствующие строки взяты из журнала принтера.)
Мой RegEx (.NET Flavor) выглядит следующим образом:
.*(header_\d{10,11}_).*(_.*_\d{8}).*(\.\w{3,4}).*
-------------------------------------------
.* # Ignore some garbage in the front
(header_ # Match the start of the file name,
\d{10,11}_) # including the ID (10 - 11 digits)
.* # Ignore the type code in the middle
(_.*_\d{8}) # Match some random characters, then an 8-digit date
.* # Ignore anything between this and the file extension
(\.\w{3,4}) # Match the file extension, 3 or 4 characters long
.* # Ignore the rest of the string
Я ожидаю, что это будет соответствовать строкам вроде:
str1 = "header_0000000602_t_mc2e1nrobr1a3s55niyrrqvy_20081212[1].doc [Compatibility Mode]"
str2 = "Microsoft PowerPoint - header_00000000076_d_al41zguyvgqfj2454jki5l55_20071203[1].txt"
str3 = "header_00000000076_d_al41zguyvgqfj2454jki5l55_20071203[1]"
Где группы захвата возвращают что-то вроде:
$1 = header_0000000602_
$2 = _mc2e1nrobr1a3s55niyrrqvy_20081212
$3 = .doc
Где $ 3 может быть пустым, если расширение файла не найдено. $ 3 является необязательной частью, как вы можете видеть в str3 выше.
Если я добавлю "?" до конца третьей группы захвата "(. \ w {3,4})?", RegEx больше не захватывает $ 3 для какой-либо строки. Если я добавлю «+» вместо «(. \ W {3,4}) +», RegEx больше не будет захватывать str3, чего и следовало ожидать.
Я чувствую, что используя "?" в конце третьей группы захвата - подходящая вещь, но она не работает, как я ожидаю. Возможно, я слишком наивен с разделами ". *", Которые я использую для игнорирования частей строки.
Не работает, как ожидалось:
.*(header_\d*_).*(_.*_.{8}).*(\.\w{3,4})?.*