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

StackOverflow https://stackoverflow.com/questions/3032593

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top