我在编程书中读到过.*?通常会使正则表达式不贪婪,而是匹配最短的匹配.
但是,它不能满足以下要求:
正则表达式: http.*?500.jpg
测试字符串: http://google.com<img src="http://33.google.com/image/500.jpg
我想只匹配最短的,即:http://33.google.com/image/500.jpg
.
但事实并非如此.它匹配整个字符串......
我已经尝试过阅读有关正则表达式的更多内容,但是,我无法解决这个问题.
我怎样才能选择最短的字符串匹配,就像这个例子一样?
我知道已经有两个答案,但有时候有另一种方法来看待它并处理它.
问题
当引擎位于第一个引擎之前时h
,它会尽力匹配正则表达式http.*?500.jpg
.那个正则表达式可以匹配吗?是的,它可以.匹配后http
,引擎会保持懒惰匹配,直到遇到为止500.jpg
.没有什么可以阻止的.你告诉它必须匹配尽可能多的字符,这就是它正在做的事情.
相反,假设你有两个这个字符串 500.jpg
http://google.com<img src="http://google.com/500.jpg 1500.jpg
^ lazy .*? stops here
^ greedy .* stops here
Run Code Online (Sandbox Code Playgroud)
贪婪的人将匹配整个字符串.但懒惰的人会尽快停止:和以前一样.在这里你可以看到贪婪和懒惰之间的区别.
解决方法:不要使用Dot-Star-使用正确的令牌
假设您知道每个http
字符串后面都有空格或换行符.你可以使用一个懒惰的匹配http\S*?\.jpg
点是,\S*
匹配任何不是"空白字符"(换行符,标签等)的字符都不能跳过空格,不像点星.
参考
此外,我强烈建议您阅读下面的文章,因为它应该有助于任何剩余的混乱.
归档时间: |
|
查看次数: |
3830 次 |
最近记录: |