У меня есть строка с номером:
dfdf00023546546
Я хочу получить только номер:
(0*)(\d+) works
(0*)(\d*) doesn't work
(0*)(\d*$) works
если плюс означает 1 или больше, а звездочка означает 0 или больше, не полагается ли * поймать больше, чем +? почему добавление знака $ заставляет его работать?
Спасибо
Все версии обязательно будут работать (при правильном использовании).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


g, который, вероятно, не установлен. Если вы установите этот глобальный режим, вы увидите ожидаемая подстрока совпадает.Этот (0*)(\d*) соответствует, но возвращает более двух групп в режиме g, поскольку оба шаблона количественно определены по *, включая совпадения нулевой длины.
Квантификатор + обозначает по крайней мере одно вхождение предыдущего токена, поэтому он ищет то, что его существование является обязательным. При этом он не возвращает совпадений нулевой длины.
Ваша третья попытка (0*)(\d*$) работает так же, как квантификатор +, по той причине, что совпадения нулевой длины не могут произойти раньше, чем совпадение цифр, соответствующих концу входной строки. Однако с этим регулярным выражением в конце есть совпадение нулевой длины, когда включен режим g.
Это может быть трудно понять, но ваше регулярное выражение будет примерно таким:
(0*)(\d+) вернет одно совпадение 00023546546.(0*)(\d*$)
вернет 2 совпадения 00023546546 и
конец строки {empty}. Второе совпадение связано с тем, что он должен проверить на ноль или
больше вхождений 0 - это может быть {empty} и ноль или более
вхождения чисел от 0 до 9 - опять же, это может быть {empty} и конец проверки строки.(0*)(\d*), с другой стороны, проверяет 6 разных позиций - перед каждой буквой, потому что технически совпадением может быть {empty} в соответствии с вашим регулярным выражением. Одно непустое совпадение, которое вернет ваши числа, и одно совпадение конца строки, которое снова будет пустым.Помните, что регулярное выражение будет не только соответствовать символам, но и производить совпадения с нулевой длиной.
(0*)(\d*) на самом деле работает, просто он соответствует тому, что вы хотите плюс, некоторые пустые совпадения:
[ '', '', '', '', '00023546546', '' ]
Видите эти совпадения нулевой длины?
Теперь я объясню, зачем нужны совпадения нулевой длины. В вашем регулярном выражении должно быть 0 или более 0, за которыми следует 0 или более цифр. Это означает, что он может соответствовать 0 0 и 0 цифрам, не так ли? Таким образом, пробел между каждым символом соответствует, потому что эта «подстрока» имеет ровно 0 0 и 0 цифр!
Кстати, (0*)(\d*$) будет работать, только если совпадение будет в конце строки.
Я не могу воспроизвести проблему