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

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

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

Вопросы следующие:

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

person polygenelubricants    schedule 13.06.2010    source источник


Ответы (4)


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

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

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

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

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

person Ahmad Mageed    schedule 13.06.2010
comment
+1, я тоже считаю, что сокращение лучше, но я также люблю вложенные тернарии, и меня буквально кричали за это. Я вижу, что некоторые люди могут подумать, что {0,1} показывает намерение более ясно, чем ?, отсюда Q. - person polygenelubricants; 13.06.2010

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

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

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

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

person Alan Moore    schedule 13.06.2010

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

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

person tiftik    schedule 13.06.2010

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

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

person dkretz    schedule 13.06.2010