#regex #perl
#регулярное выражение #perl
Вопрос:
Как я могу сопоставить необязательный символ в выражении регулярного выражения?
Я пытаюсь записать небольшой файл, который выполняет небольшую работу по обслуживанию нашего NAS.
Скрипт просматривает папки внутри указанной корневой папки.
Для моего тестирования корень C:UsersSolignisDesktopOrders
Здесь у меня происходит первое совпадение, оно проверяет, соответствует ли файл нашему стандартному соглашению о названии, которое является городом 3-значный номер папки 3-значный номер файла.
Однако иногда у нас есть дополнительные файлы, в которых есть _1 or _2
для обозначения дополнительной страницы.
Как я могу сделать так, чтобы это регулярное выражение также соответствовало «необязательному» _1 or _2 and sometimes _3
в совпадении?
Код:
$file =~ /^ ((C[A|F|L]|ME)) (d{3}) (d{3}) . (PDF) /xmi
Я уверен, что это просто, у меня все еще есть зацикленность на мозге от необходимости «сверлить» этот гигантский хэш массивов, который я создал, что составляет что-то вроде файлов 25k в некоторых массивах.
Любая помощь была бы высоко оценена.
Спасибо
Комментарии:
1.
[A|F|L]
Работает для вас?[AFL]
правильно, ИМХО, а также двойные скобки((....))
к(C[AFL]|ME)
было бы лучше2. Это делает то же самое? Если это работает для меня, потому что это работает и с альтернативами между каждой буквой. Но ваш способ менее загроможден.
3. @Solignis, не то же самое, я думаю, что ваше регулярное выражение будет соответствовать названному файлу
"C|111222.PDF"
. а двойные скобки сделают ваши $ 1 и $ 2 одинаковыми. Но простое изменение((...))
на(...)
нарушило бы ваш код, вам нужно обновить код, который использовал $ 3, $ 4, $ 5, ИМХО.4.
|
ничего не делают, кроме как заставляютC|
быть допустимым совпадением5. Я вижу, что единственными допустимыми совпадениями «должно» быть
CA, CF, CL and ME
больше ничего.
Ответ №1:
Что-то вроде (_[1-3])?
?
Соответствует нулю или одному экземпляру.
возможно, это то, что вы ищете.
Комментарии:
1. можно ли это расширить, чтобы соответствовать
_d*
?2. Потрясающе, это работает!, Я «вставил» это в ту часть выражения, которая ищет номер файла. Работает идеально, большое спасибо.
Ответ №2:
Что-то вроде (?: _[1-3] )?
если не хотите перехватывать эту группу.