我有以下正则表达式:
var regEx = /^\W*(.*?)\W*$/;
var regEx2 = /^\W*(.*)\W*$/;
- 实际上是什么
(.*?)
意思?(.*?)
和有什么区别(.*)
? - 为什么在 Javascript中
regEx.exec("abc ")
返回?['abc ', 'abc']
- 为什么在 Javascript中
regEx2.exec("abc ")
返回?['abc ', 'abc ']
我有以下正则表达式:
var regEx = /^\W*(.*?)\W*$/;
var regEx2 = /^\W*(.*)\W*$/;
(.*?)
意思?(.*?)
和有什么区别(.*)
?regEx.exec("abc ")
返回?['abc ', 'abc']
regEx2.exec("abc ")
返回?['abc ', 'abc ']
?
在量词之后添加*
, +
,{n,m}
等会产生不情愿/惰性匹配,而不是默认的贪婪匹配。从名字上看很直观。贪婪意味着它将尝试尽可能多地匹配。Lazy 意味着它将尝试尽可能少地匹配。
没有非单词\W
标记,因此\W*
匹配空字符串。然后(.*?)
将尽可能少地匹配,但检查是否\W*
可以匹配某些东西。所以(.*?)
将 match 和capture "abc"
,并且\W*
(non-word) 将匹配空格。
与上面几乎相同,但(.*)
会尽可能多地吃掉并匹配和捕获 "abc "
,并且\W*
会留下空字符串,它匹配。
对于 2 和 3,返回数组中的第二个元素是正则表达式中第一个捕获组捕获的文本。数组中的第一个元素是匹配整个正则表达式的文本。
(.*?) 实际上是什么意思?
在匹配组中非贪婪地匹配任何字符零次或多次。
为什么 regEx.exec("abc") 在 Javascript 中返回 ['abc', 'abc']?
您为每个匹配组获得一个数组成员。索引 0 处的元素是整个匹配项,下一个元素来自上面的第一个(也是唯一的)匹配组。
为什么 regEx2.exec("abc") 在 Javascript 中返回 ['abc', 'abc']?
出于与上述相同的原因,除了这一次,贪婪匹配也会匹配末尾的空格,因此在这种情况下,您的第一个捕获组与完整匹配相同。
好的,在查看我发现的正则表达式时,最简单的做法是将它们分解并写出每个部分在做什么。
所以取第一个正则表达式/^\W*(.*?)\W*$/
^ Start of search string
\W* Match a non-word character zero or more times
( Start of group
.*? Match any character (except a line terminator) zero or more times but as few as possible
) End of group
\W* Match a non-word character zero or more times
$ End of search string
该exec
方法搜索文本并返回一个字符串数组(如果失败,则返回 null)。元素 0 处的字符串是整个表达式匹配的子字符串,其后的字符串是对应于各个捕获组的字符串。
因此,对于您的第一个示例,整个表达式正在捕获"abc "
,但(.*?)
组正在捕获"abc"
,因此您在数组中获得了两个项目