javascript中正则表达式的歧义性
javascript中正则表达式的歧义性,javascript,regex,Javascript,Regex,var a='a\na' console.log(a.match(/.*/g))//['a',''a',']我可以为以下内容提供最好的解释: 'ab\na'.match(/.*/g) ["ab", "", "a", ""] print('ab\na'.match(/.+/g)) ab,a JavaScript的match函数在dot-ALL模式下使用dot-not,这意味着点在换行符之间不匹配。当*模式应用于ab\na时,它首先匹配ab,然后在换行处停止。换行符生成一个空匹配项。然后,a被匹
var a='a\na'
console.log(a.match(/.*/g))//['a',''a',']
我可以为以下内容提供最好的解释:
'ab\na'.match(/.*/g)
["ab", "", "a", ""]
print('ab\na'.match(/.+/g))
ab,a
JavaScript的match
函数在dot-ALL模式下使用dot-not,这意味着点在换行符之间不匹配。当*
模式应用于ab\na
时,它首先匹配ab
,然后在换行处停止。换行符生成一个空匹配项。然后,a
被匹配,然后出于某种原因,字符串的结尾与另一个空匹配匹配
如果您只想从每行提取非空白内容,则可以尝试以下操作:
'ab\na'.match(/.*/g)
["ab", "", "a", ""]
print('ab\na'.match(/.+/g))
ab,a
星形运算符
*
表示可以有任意数量的眼(甚至0眼)。使用表达式时,空字符串可以是匹配项。不确定你在寻找什么,但也许一个+
操作员(1个或更多眼)会更好
要添加更多信息,regex默认使用贪婪算法(在某些语言中,您可以覆盖此行为),因此它将尽可能多地拾取文本。在这种情况下,它将选择a,因为它可以用正则表达式处理,所以“\na”仍然存在。“\n”与“”不匹配,因此唯一可用的选项是空字符串。然后,我们将处理下一行,再次,我们可以匹配一个“a”。在此之后,只有空字符串与正则表达式匹配
假设有空字符串,为什么开头没有呢
最后
*
应用贪婪。它会尽快吞下一整条线。我指的是断线前的一切。当它遇到一行的末尾时,由于星号量词,它再次匹配
如果您想要4,您可以将?
添加到星号量词中,并使其成为惰性的*?
,但是由于处理方式的不同,这个正则表达式有不同的结果
您可以使用regex101中的PCRE和JS引擎尝试*?
,并查看它们的区别
问题:
您可能会问,为什么引擎会试图在生产线的末尾找到匹配项,而整个产品已经匹配
回答:
这是因为我们对行尾和字符串尾有一个定义。所以并不是所有的东西都是匹配的。有一个左边的位置有机会被匹配,我们有星量词
此左侧位置是此处的行尾,当启用m
标志时,它与$
真正匹配。A
与此位置不匹配,但A*
或*?
匹配,因为它们也是零长度位置的模式,就像任何X星模式一样,如\d*
,\d*
,A*
或b?
*与前面的表达式匹配0次或多次
。匹配除换行符以外的任何单个字符
这就是官方医生所说的。及*。我猜你收到的数组是这样的:
[ the first "any character" of the first line, following "nothing", the first "any character" of the second line, following "nothing"]
而新行字符只是被忽略了考虑一下,
*
表示“前面的零个或多个”,其中包括空字符strings@FedericoklezCulloca是的,我的问题更新了一点bit@user202729标签在页面标题中的什么位置?。“在生成页面标题时,系统会自动将最常用的标签预先添加到问题标题中(除非它已经在问题标题中的某个位置)。@user202729是的,我想如果你不包含标签,它可能会建议添加标签,但这有什么大不了的?@user202729可能我的大脑想得太快了。我根据您的请求添加了一个描述。换行符生成一个空匹配项。这不是原因。此空匹配与第二个空匹配是同一种类型,它没有后面的换行符。@revo我可能应该说换行符处的暂停。我认为本例中的换行符基本上就像一个零宽度分隔符。我的全部观点是,它不是换行符,因为默认行为与换行符没有任何关系。它是产生空字符串的零长度位置的行尾。@revo OK…但行尾之所以在那里,是因为它是由一个换行符(或最末尾的$
进行的)。如果这是原因,那么为什么'ab\na'。匹配(/.*/g)
给出[“ab”,“a”,“a”]< N/IT >因为贪婪的匹配。@ NIT如果你足够了解API,然后考虑回答(我不)。@ TimiGeEeleSee不应该是“如果你不知道API足够好,然后考虑不回答”?我相信JS的<代码>匹配不使用点全模式中的点。当它到达一个换行符时,会生成一个空匹配项。虽然不确定最后的空匹配,但可能是由某人生成的$
锚。