Использование явно пронумерованного повторения вместо знака вопроса, звездочки и плюса - PullRequest
50 голосов
/ 13 июня 2010

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

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

Вопросы:

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

Ответы [ 4 ]

66 голосов
/ 13 июня 2010

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

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

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

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

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

7 голосов
/ 14 июня 2010

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

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

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

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

2 голосов
/ 13 июня 2010
  • Они все идентичны, если вы не используете исключительный движок регулярных выражений. Однако не все движки регулярных выражений поддерживают нумерованное повторение ? или +.

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

1 голос
/ 13 июня 2010

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

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

...