([+-]?)
против ([+-])?
- крайний случай плохой практики. Мы можем видеть различие, когда применяем ту же идею к другому захвату.
(\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+)
относится к классу пустышек регулярных выражений. В итоге, поместите полное описание того, что вы захватываете внутри группы захвата.
Обратите внимание, что несмотря ни на что, есть только две группы захвата.