Возможный дубликат:
что означает ленивое и жадное средство в регулярном выражении?
Я знаю, что в Regex вопросительный знак после *, + или? означает неровный, но если я хочу соответствовать любому персонажу, в чем разница между использованием (. *) или (. *?)?
Благодарю.
EDIT: В моем случае я хочу проверить URL. Каковы различия между
http://site\.net/(.*?)\.html
а также
http://site\.net/(.*)\.html
?
Предположим, что у вас есть этот URL:
http://site.net/some/wierd/path.html?returnTo=somedoc.html
Жадный будет соответствовать всей линии:
http://site.net/some/wierd/path.html?returnTo=somedoc.html
в то время как non gready возвращается:
http://site.net/some/wierd/path.html
http://refiddle.com/ отлично подходит для тестирования регулярных выражений
.*
является жадным, что означает, что он будет игнорировать следующий разделитель вашего регулярного выражения до тех пор, пока он сам не будет выполнен, если только регулярное выражение, следующее .*
не соответствует концу целевой строки.
.*?
является неотразимым, что означает, что он перейдет к следующему разделителю вашего регулярного выражения, если следующий будет выполнен. Он будет продолжаться до следующего разделителя, даже если сам по-прежнему применим.
Пример:
/(.*) dog/
будет соответствовать «Я думаю, что ваша собака укусила мою собаку», а группа 1 будет «Я думаю, что ваша собака укусила меня».
/(.*?) dog/
будет соответствовать «Я думаю, что твоя собака укусила мою собаку», а группа 1 будет «Я думаю твоя».
Если в регулярном выражении нет ничего (.*)
То нет никакой разницы. Однако, если есть что-то следующее, то есть разница:
"I went to the shops and then I went home" /(.*) went/ => "[I went to the shops and then I] went" /(.*?) went/ => "[I] went"
Поскольку вы уже знаете, что негласное поведение в шляпе, я не буду объяснять это снова.
Это зависит от того, что происходит после (.*?)
Это то, за что невращающееся поведение.
Интересно, что это означает, что регулярное выражение в форме / (.* /(.*?)/
не имеет большого смысла – потому что, как вы можете быть ленивым, если вы все равно согласитесь?
Если вы попытаетесь создать это регулярное выражение, например, в Regexr , оно даже не будет компилироваться, потому что это абсурд.
Только если вы поместите что-то за группу, ваше регулярное выражение будет иметь какой-то смысл. Я не уверен, что все двигатели rege делают то же самое, что и Regexr, и отказываются принимать это регулярное выражение.
Итак, если вы хотите сопоставить что-либо до определенного персонажа, вам нужно будет поместить этого конкретного персонажа после вашей негритянской группы. Таким образом, все до этого конкретного символа сопоставляется.
Привести его к выводу; это не имеет никакого значения, ЕСЛИ нет ПОСЛЕ группы.