Использование явно пронумерованного повторения вместо вопросительного знака, звезды и плюс
-
27-09-2019 - |
Вопрос
Я видел шаблоны Regex, которые используют явно пронумерованное повторение вместо ?
, *
а также +
, т.е.
Explicit Shorthand
(something){0,1} (something)?
(something){1} (something)
(something){0,} (something)*
(something){1,} (something)+
Вопросы:
- Эти две формы идентичны? Что делать, если вы добавите притяжательные / неохотные модификаторы?
- Если они идентичны, какой из них более идиоматичен? Более читаемый? Просто «лучше»?
Решение
Для моих знаний они идентичны. Я думаю, что там, возможно, несколько двигателей, которые не поддерживают пронумерованный синтаксис, но я не уверен, который. Я смутно вспоминаю вопрос на так несколько дней назад, где явная запись не будет работать в 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
), но есть и другие способы сделать это.
Они все идентичны, если вы не используете исключительный двигатель REGEX. Однако не все двигатели Regex поддерживают пронумерованные повторения,
?
или+
.Если все они доступны, я бы использовал символы, а не цифры, просто потому, что для меня это более интуитивно понятно.
Они эквивалентны (и вы узнаете, если они доступны, тестируя свой контекст.)
Проблема, которую я ожидаю, когда вы не можете быть единственным человеком, когда-либо требующим работать с вашим кодом. Regexes достаточно сложно для большинства людей. В любое время кто-то использует необычный синтаксис, возникает вопрос: «Почему они не делали это стандартным способом? Что они думали, что я скучаю?»