Регулярное выражение, плюс против звездочки

У меня есть строка с номером:

dfdf00023546546

Я хочу получить только номер:

(0*)(\d+) works
(0*)(\d*) doesn't work
(0*)(\d*$) works 

если плюс означает 1 или больше, а звездочка означает 0 или больше, не полагается ли * поймать больше, чем +? почему добавление знака $ заставляет его работать?

Спасибо

Я не могу воспроизвести проблему

Quentin 25.03.2018 12:58

Все версии обязательно будут работать (при правильном использовании).

dfsq 25.03.2018 12:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
622
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ваша проблема связана с режимом 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*$) будет работать, только если совпадение будет в конце строки.

Другие вопросы по теме