необязательный синтаксис группы захвата - PullRequest
0 голосов
/ 12 февраля 2020

Я собираю ведущий символ знака, если он присутствует, отдельно от следующих цифр.

То есть ([+-]?)(\d+) или ([+-])?(\d+)?

Они оба работают, согласно мое (ограниченное) тестирование. Есть ли причина отдавать предпочтение одному другому?

1 Ответ

1 голос
/ 12 февраля 2020

([+-]?) против ([+-])? - крайний случай плохой практики. Мы можем видеть различие, когда применяем ту же идею к другому захвату.

(\d+) vs (\d)+

Оба регулярных выражения соответствуют одной или нескольким цифрам. Первый говорит, чтобы захватить хотя бы одну ди git. Второй говорит, чтобы захватить один ди git несколько раз; только последний ди git будет захвачен.

Демонстрация .

([+-]?) против ([+-])? такая же, но без (почти) никаких последствий. Они оба соответствуют нулю или одному + или -. Первый говорит, чтобы захватить ноль или один + или -. Второе говорит, чтобы захватить один + или - ноль еще Они немного отличаются.

Если мы возьмем 123, ([+-]?) будет соответствовать, но ([+-])? не будет. Мы можем видеть различие в Ruby.

p "123".match(/([+-])?(\d+)/)
#<MatchData "123" 1:nil 2:"123">

p "123".match(/([+-]?)(\d+)/)
#<MatchData "123" 1:"" 2:"123">

Обратите внимание на разницу в первой группе захвата. В первом регулярном выражении первый захват не совпадает. Во втором регулярном выражении первый захватил пустую строку; допустимое совпадение [+-]?.

Этот конкретный пример , вероятно, не будет иметь никакого значения, но предпочтительным является ([+-]?)(\d+), поскольку ([+-])?(\d+) относится к классу пустышек регулярных выражений. В итоге, поместите полное описание того, что вы захватываете внутри группы захвата.


Обратите внимание, что несмотря ни на что, есть только две группы захвата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...