Подтвердить что ты не робот

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

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

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

Вопросы:

  • Являются ли эти две формы одинаковыми? Что делать, если вы добавляете притяжательные/неохотные модификаторы?
  • Если они идентичны, какой из них более идиоматичен? Более читабельны? Просто "лучше"?
4b9b3361

Ответ 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 достаточно сложно для большинства людей. Каждый раз, когда кто-то использует необычный синтаксис, возникает вопрос возникает: "Почему они не сделали это стандартным образом? Что они думали, что мне не хватает?"