Использование явно пронумерованного повторения вместо вопросительного знака, звезды и плюс
Я видел шаблоны регулярных выражений, которые используют явно пронумерованное повторение вместо ?
, *
и +
, то есть:
Explicit Shorthand
(something){0,1} (something)?
(something){1} (something)
(something){0,} (something)*
(something){1,} (something)+
Вопросы:
- Являются ли эти две формы одинаковыми? Что делать, если вы добавляете притяжательные/неохотные модификаторы?
- Если они идентичны, какой из них более идиоматичен? Более читабельны? Просто "лучше"?
Ответы
Ответ 1
Насколько мне известно, они идентичны. Я думаю, что там может быть несколько двигателей, которые не поддерживают пронумерованный синтаксис, но я не уверен, что. Я смутно вспоминаю вопрос о SO несколько дней назад, когда явное обозначение не работало в Notepad ++.
Единственный раз, когда я буду использовать явно пронумерованное повторение, - это когда повторение больше 1:
- Точно два:
{2}
- Два или более:
{2,}
- Два-четыре:
{2,4}
Я предпочитаю это особенно, когда повторяющийся рисунок больше нескольких символов. Если вам нужно сопоставить 3 числа, некоторым людям нравится писать: \d\d\d
, но я предпочитаю писать \d{3}
, поскольку он подчеркивает количество повторений. Кроме того, по дороге, если это число когда-либо должно измениться, мне нужно только изменить {3}
на {n}
, а не повторно анализировать регулярное выражение в моей голове или беспокоиться о его запуске; это требует меньших умственных усилий.
Если эти критерии не выполнены, я предпочитаю сокращение. Использование "явной" записи быстро загромождает шаблон и затрудняет его чтение. Я работал над проектом, в котором некоторые разработчики не слишком хорошо знали регулярное выражение (это не совсем каждая любимая тема), и я видел много событий {1}
и {0,1}
. Несколько человек попросили бы меня пересмотреть свой шаблон и что, когда я предлагаю изменить эти события на сокращенные обозначения и сэкономить место, а IMO улучшит читаемость.
Ответ 2
Я могу видеть, как, если у вас есть регулярное выражение, которое выполняет много ограниченного повторения, вы можете использовать форму {n,m}
для удобства чтения. Например:
/^
abc{2,5}
xyz{0,1}
foo{3,12}
bar{1,}
$/x
Но я не могу вспомнить, что когда-либо видел такой случай в реальной жизни. Когда я вижу в вопросе {0,1}
, {0,}
или {1,}
, он практически всегда делается из-за невежества. И в процессе ответа на такой вопрос мы также должны предположить, что вместо этого они используют ?
, *
или +
.
И, конечно, {1}
- чистый беспорядок. Некоторые люди, похоже, имеют смутное представление о том, что это означает "один и только один" - в конце концов, это должно означать что-то, не так ли? Почему такой патологически краткий язык поддерживает конструкцию, которая занимает целых три символа и ничего не делает? Его единственное законное использование, о котором я знаю, состоит в том, чтобы изолировать обратную ссылку, за которой следует буквальная цифра (например, \1{1}0
), но есть и другие способы сделать это.
Ответ 3
-
Все они идентичны, если вы не используете исключительный механизм регулярных выражений. Однако не все регулярные выражения поддерживают повторение с номером, ?
или +
.
-
Если все они доступны, я буду использовать символы, а не цифры, просто потому, что это более интуитивно для меня.
Ответ 4
Они эквивалентны (и вы узнаете, доступны ли они, протестировав ваш контекст.)
Проблема, которую я ожидал, заключается в том, что вы не можете быть единственным человеком, когда-либо нуждающимся в работе с вашим кодом.
Regexes достаточно сложно для большинства людей. Каждый раз, когда кто-то использует необычный синтаксис, возникает вопрос
возникает: "Почему они не сделали это стандартным образом? Что они думали, что мне не хватает?"