这与不情愿的量词有什么关系?



>有人知道为什么这在javascript中不起作用吗?(尝试使用Chrome和Firefox):

console.log('"my name is"'.match(/"?(.*?)"?/));

输出此内容:

[""", "", index: 0, input: ""my name is""] 

我期望这个:

[""my name is"", "my name is", index: 0, input: ""my name is""]

我对解决问题的替代方法不感兴趣,无论如何,对于我想要实现的目标来说,这不是一个完整的解决方案(我现在做了一个稍微不同的方式)——我只是对为什么比赛失败感兴趣。

我希望不情愿的量词能够匹配所有内容,但不包括最终报价。 我不明白为什么表达式无法匹配任何东西?

考虑

> "foo".match(/.*?/)
[""]

?告诉正则表达式尽可能少地匹配,空字符串是它所能得到的最好的。同样地

> "foo".match(/x/)
null
> "foo".match(/x?/)
[""]

可选模式永远不会失败,并且匹配其内容或空字符串。

在您的示例中,它首先匹配引号,然后将空字符串与 (.*?) 匹配,将(另一个)空字符串与 "? 匹配。由于两个测试都成功了,因此它不会再看了,结果只是一个报价。

问题是模式中的所有内容,包括周围的引号,都是可选的。 这意味着它很容易匹配空字符串。那么正则表达式引擎内部发生了什么?

  • 引擎尝试匹配第一个"?。没问题,它与字符串中的第一个"匹配。
  • 引擎移动到模式的下一部分,.*? .好吧,第一个"后面的零长度子字符串与此匹配,因此它继续。
  • 引擎移动到模式的最后一部分,"? .下一个字符是 m ,所以这不匹配,但这没关系,因为最后一个"是可选的,所以它不会被捕获。

因此,第一场比赛只是第一"

您的正则表达式可以匹配任何内容(好吧,只要没有新行)。

  • "?:无约束(可以为空,但如果可能,则不会)
  • .*?:完全没有约束,可以是整个字符串,甚至可以是空字符串
  • "?:无约束(可以为空)

表达式没有匹配任何内容:第一个匹配项是"

当你说.*?时,你实际上是在要求JavaScript将0与无限匹配匹配,但随后你立即用?控制它,这意味着非贪婪搜索。只需删除其中的?,您应该没问题。

var regEx = /"?.*"?/;
console.log('"my name is"'.match(regEx)[0]);
console.log('my name is'.match(regEx)[0]);

此正则表达式将匹配两个字符串,带或不带"

您可以使用以下代码:

console.log('"my name is"'.match(/"?(.*)"?/));

结果:

[""my name is"", "my name is"", index: 0, input: ""my name is""] 

您的问题解释

REGEX:     /"?(.*)?"?/g

代码中的(.*)?问题。这是一种repeated capturing group.

重复的捕获组将仅捕获最后一个迭代。放一个 捕获重复组周围的组以捕获所有迭代或 如果对数据不感兴趣,请改用非捕获组

由于您的输入是"my name is"的,因此(.)*它将捕获"my name is"

但是在(.*)?的情况下,由于它是重复捕获的,它将只捕获最后一次迭代,即"

有关更多详细信息,请参阅重复捕获组

最新更新