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