1

我有以下正则表达式:

var regEx = /^\W*(.*?)\W*$/;
var regEx2 = /^\W*(.*)\W*$/;
  1. 实际上是什么(.*?)意思?(.*?)和有什么区别(.*)
  2. 为什么在 Javascript中regEx.exec("abc ")返回?['abc ', 'abc']
  3. 为什么在 Javascript中regEx2.exec("abc ")返回?['abc ', 'abc ']
4

3 回答 3

4
  1. ?在量词之后添加*, +,{n,m}等会产生不情愿/惰性匹配,而不是默认的贪婪匹配。从名字上看很直观。贪婪意味着它将尝试尽可能多地匹配。Lazy 意味着它将尝试尽可能少地匹配。

  2. 没有非单词\W标记,因此\W*匹配空字符串。然后(.*?)将尽可能少地匹配,但检查是否\W*可以匹配某些东西。所以(.*?)将 match 和capture "abc",并且\W*(non-word) 将匹配空格。

  3. 与上面几乎相同,但(.*)会尽可能多地吃掉并匹配和捕获 "abc ",并且\W*会留下空字符串,它匹配。

对于 2 和 3,返回数组中的第二个元素是正则表达式中第一个捕获组捕获的文本。数组中的第一个元素是匹配整个正则表达式的文本。

于 2012-07-10T05:46:12.260 回答
3

(.*?) 实际上是什么意思?

在匹配组中非贪婪地匹配任何字符零次或多次。

为什么 regEx.exec("abc") 在 Javascript 中返回 ['abc', 'abc']?

您为每个匹配组获得一个数组成员。索引 0 处的元素是整个匹配项,下一个元素来自上面的第一个(也是唯一的)匹配组。

为什么 regEx2.exec("abc") 在 Javascript 中返回 ['abc', 'abc']?

出于与上述相同的原因,除了这一次,贪婪匹配也会匹配末尾的空格,因此在这种情况下,您的第一个捕获组与完整匹配相同。

于 2012-07-10T05:37:18.913 回答
0

好的,在查看我发现的正则表达式时,最简单的做法是将它们分解并写出每个部分在做什么。

所以取第一个正则表达式/^\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",因此您在数组中获得了两个项目

于 2012-07-10T05:49:08.647 回答