Регулярное выражение для удаления пробелов и комментариев из регулярных выражений режима свободного пробела и комментариев - PullRequest
0 голосов
/ 22 мая 2019

Я пишу регулярное выражение 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])

Это близко, за исключением того, что пробелы сразделитель [- /.] частей шаблона потерял буквальное пространство.

Как изменить этот шаблон таким образом, чтобы буквенное пространство (и #) символов с [] сохранились?

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Вот мое решение:

# Match any literal whitespace character, except when within a valid character class
# at first position, or second position after `-`
(?<!\\|(?<!\\)\[|(?<!\\)\[-)\s 
|
# Match comments (any text following a literal # until end-of-line), except when
# within a character class at first position, or second position after `-` or third
# position after `- `
(?<!\\|(?<!\\)\[|(?<!\\)\[-|(?<!\\)\[\ |(?<!\\)\[-\ )\#.*$\r?\n?

Результаты минимизации себя:

(?<!\\|(?<!\\)\[|(?<!\\)\[-)\s|(?<!\\|(?<!\\)\[|(?<!\\)\[-|(?<!\\)\[\ |(?<!\\)\[-\ )\#.*$\r?\n?

https://regex101.com/r/3EVpuH/1

Преимущество этого решения заключается в том, что оно не зависит от контрольных глаголов возврата (о которых я не слышал, пока не изучил, увидев решение Михаила ).

Недостатком (по сравнению с решением Михаила) является то, что если вы хотите указать тире, пробел и / или # символы внутри класса символов, они должны появляться в определенном порядке: тире, пробел, затем хеш, т.е. [- #] , Я не знаю, может ли это требование быть устранено без использования контрольных глаголов.

0 голосов
/ 22 мая 2019

Может быть, это регулярное выражение может помочь

(?:\[(?:[^\\\]]++|\\.)*+\]|\\.)(*SKIP)(*F)|\#.*?$|\s++
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...