Используя явно пронумерованное повторение вместо вопросительного знака, звезды и плюс

Я видел regex шаблоны, которые используют явно пронумерованное повторение вместо ?, * и +, т.е.:

Explicit            Shorthand
(something){0,1}    (something)?
(something){1}      (something)
(something){0,}     (something)*
(something){1,}     (something)+

Вопросы:

  • Действительно ли эти две формы идентичны? Что, если Вы добавляете притяжательные/отказанные модификаторы?
  • Если они идентичны, какой более идиоматичен? Более читаемый? Просто "лучше"?
54
задан Alan Moore 13 June 2010 в 12:49
поделиться

4 ответа

Насколько мне известно, они идентичны. Я думаю, что есть несколько движков, которые не поддерживают пронумерованный синтаксис, но я не уверен, какие именно. Я смутно припоминаю вопрос о SO несколько дней назад, когда явная нотация не работала в Notepad ++.

Я бы использовал явно пронумерованное повторение только тогда, когда повторение больше 1:

  • Ровно два: {2}
  • Два или более: {2,}
  • От двух до четырех: {2,4}

Я предпочитаю их, особенно когда повторяющийся узор состоит из более чем нескольких символов. Если вам нужно сопоставить 3 числа, некоторые люди любят писать: \ d \ d \ d , но я бы предпочел написать \ d {3} , поскольку это подчеркивает количество задействованных повторений . Кроме того, в будущем, если это число когда-либо потребуется изменить, мне нужно будет только изменить {3} на {n} , а не повторно анализировать регулярное выражение в моей голове и не беспокоиться о испортить это; это требует меньше умственных усилий.

Если этот критерий не выполняется, я предпочитаю сокращенную запись.Использование «явных» обозначений быстро загромождает шаблон и затрудняет его чтение. Я работал над проектом, в котором некоторые разработчики не знали регулярных выражений слишком хорошо (это не совсем всеобщая любимая тема), и я видел много {1} и {0,1} находок. Некоторые люди попросили бы меня проверить код их шаблона, и тогда я бы предложил изменить эти вхождения на сокращенные обозначения и сэкономить место и, IMO, улучшить читаемость.

70
ответ дан 7 November 2019 в 08:04
поделиться
  • Все они идентичны, если вы не используете исключительный механизм регулярных выражений. Однако не все механизмы регулярных выражений поддерживают нумерованное повторение, ? или + .

  • Если бы все они были доступны, я бы использовал символы, а не числа, просто потому, что для меня это более интуитивно понятно.

2
ответ дан 7 November 2019 в 08:04
поделиться

Я могу понять, как, если у вас есть регулярное выражение, которое выполняет много ограниченных повторений, вы можете последовательно использовать форму {n, m} для удобства чтения. Например:

/^
 abc{2,5}
 xyz{0,1}
 foo{3,12}
 bar{1,}
 $/x

Но я не припомню, чтобы когда-либо видел такой случай в реальной жизни. Когда я вижу, что {0,1} , {0,} или {1,} используются в вопросе, это практически всегда делается по незнанию . И в процессе ответа на такой вопрос мы также должны предложить вместо этого использовать ? , * или + .

И, конечно же, {1} - чистый беспорядок. Некоторые люди, кажется, имеют смутное представление о том, что это означает «один и только один» - в конце концов, это должно означать что-то , верно? Почему такой патологически лаконичный язык поддерживает конструкцию, которая занимает целых три символа и вообще ничего не делает? Единственное законное использование, которое я знаю, - это изолировать обратную ссылку, за которой следует буквальная цифра (например, \ 1 {1} 0 ), но есть и другие способы сделать это.

7
ответ дан 7 November 2019 в 08:04
поделиться

Они эквивалентны (и вы узнаете, доступны ли они, протестировав ваш контекст.)

Проблема, которую я бы предвидел, - это когда вы можете быть не единственным человеком, которому понадобится работать с вашим кодом. Регексы достаточно сложны для большинства людей. Каждый раз, когда кто-то использует необычный синтаксис, возникает вопрос возникает: "Почему они не сделали это стандартным способом? О чем они думали, что я упустил?"

.
1
ответ дан 7 November 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: