3

任何人都知道为什么这在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""]

我对解决问题的替代方法不感兴趣,而且对于我试图实现的目标(我现在用一种稍微不同的方式)来说,这也不是一个完整的解决方案——我只是对匹配失败的原因感兴趣.

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

4

5 回答 5

6

考虑

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

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

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

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

在您的示例中,它首先匹配引号,然后匹配空字符串(.*?)和(另一个)空字符串"?。由于两个测试都成功了,所以它不会再看下去,结果只是一个引用。

于 2014-01-07T12:59:56.207 回答
4

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

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

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

于 2014-01-07T12:55:21.750 回答
3

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

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

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

于 2014-01-07T12:55:05.117 回答
1

当您说 时.*?,您实际上是在要求 JavaScript 将 0 匹配到无限匹配,但随后您立即使用 控制它?,这意味着非贪婪搜索。只需删除其中?的内容,就可以了。

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

这个正则表达式将匹配两个字符串,有或没有"

于 2014-01-07T12:56:57.647 回答
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"

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

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

于 2014-01-07T13:00:56.390 回答