>有人知道为什么这在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"
,
但是在(.*)?
的情况下,由于它是重复捕获的,它将只捕获最后一次迭代,即"
。
有关更多详细信息,请参阅重复捕获组。