Я пишу регулярное выражение PCRE с целью «минимизации» других регулярных выражений PCRE, написанных в режиме свободное пространство и комментарии (/x
флаг), например:
# Match a 20th or 21st century date in yyyy-mm-dd format
(19|20)\d\d # year (group 1)
[- /.] # separator - dash, space, slash or period
(0[1-9]|1[012]) # month (group 2)
[- /.] # separator - dash, space, slash or period
(0[1-9]|[12][0-9]|3[01]) # day (group 3)
Примечание: я намеренно опустил все разделители регулярных выражений и x
flag
В результате 'минимизации' вышеприведенного выражения должны быть все буквенные пробельные символы (включая новые строки) и комментарииудаляются, за исключением буквальных пробелов в классе символов (например, [- /.]
) и экранирующих пробельных символов (например, \
):
(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])
Это регулярное выражение, которое у меня есть, написано на свободном-пространство и режим комментариев (https://regex101.com/r/RHnyWw/2/):
(?<!\\)\s # Match any non-escaped whitespace character
|
(?<!\\)\#.*\s*$ # Match comments (any text following non-escaped #)
Если предположить, что я заменяю все совпадения пустой строкой, результат:
(19|20)\d\d[-/.](0[1-9]|1[012])[-/.](0[1-9]|[12][0-9]|3[01])
Это близко, за исключением того, что пробелы сразделитель [- /.]
частей шаблона потерял буквальное пространство.
Как изменить этот шаблон таким образом, чтобы буквенное пространство (и #
) символов с [
aи ]
сохранились?