необязательное совпадение регулярных выражений?

#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] )? если не хотите перехватывать эту группу.