Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中正则表达式的歧义性_Javascript_Regex - Fatal编程技术网

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的<代码>匹配不使用点全模式中的点。当它到达一个换行符时,会生成一个空匹配项。虽然不确定最后的空匹配,但可能是由某人生成的
$
锚。