我有以下正则表达式:
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",因此您在数组中获得了两个项目