(.*?)
对于正则表达式,和有什么区别(.*)?
?
答案1
我使用了正则表达式测试器regex101.com(无关联)来测试这些。
(.*?)
匹配任意字符 ( .
) 任意次 ( *
),尽可能少的次数使正则表达式匹配 ( ?
)。您会在任何字符串上获得匹配,但由于问号的存在,您只能捕获空白字符串。当您有更复杂的正则表达式时,此功能更有用。在这里,解析器不必捕获任何内容即可获得匹配:星号允许捕获组中有任意数量的字符,而问号使解析器从输入文本中保存尽可能多的字符以供以后使用,从而导致不捕获任何内容。
(.*)?
捕获一个组零次或一次 ( ?
)。该组由任意长度 ( *
) 的任意字符 ( .
) 组成。这也会匹配任何内容,但它会捕获第一行,因为点匹配除换行符之外的任何内容。
答案2
(.*)?
举例说明和之间的(.*?)
一点区别:
首先是什么.*
?
.*
表示任意数量的任意类型字符(点),也可以是 0,即没有字符也是可能的。
(.*)?
您可以将其视为捕获位于某个文本中间的变量文本的东西:
例如,有一个程序可以检查日志消息以查看其中是否有特定内容(失败2ban)。
failregex = ^[Ll]ogin attempt for nonexistent user ('.*')? from 192.168.1.20
此时捕获用户名例如。
如果你看看regex101.com通过以下示例也许这一点会变得更加清楚:
因为?
在这一点上所谓的贪婪的它会捕获尽可能多的信息 - 换句话说:如果之前有inbetween
多个分割,那么最后的分割就是最后一个。inbetween
(.*?)
这?
使得不贪婪. 意思是如果你有类似
WORD1 bla2 WORD2 bla3 WORD2
WORD1(.*?)WORD2
只到第一个WORD2
而
WORD1(.*)WORD2
贪婪则一直持续到最后一次出现WORD2