javascript中正则表达式的歧义

时间:2018-03-13 10:50:09

标签: javascript regex

var a = 'a\na'
console.log(a.match(/.*/g)) // ['a', '', 'a', '']

为什么结果中有两个空字符串?

假设有空字符串,为什么在每行的开头和结尾都没有,因此有4个空字符串?

我不是在寻找如何选择'a'而只是想了解空字符串的存在。

4 个答案:

答案 0 :(得分:1)

我可以为以下内容提供最好的解释:

'ab\na'.match(/.*/g)
["ab", "", "a", ""]

JavaScript的match函数是否在DOT ALL模式下使用了点而不是,这意味着点匹配换行符。将.*模式应用于ab\na时,它首先匹配ab,然后停在换行符处。换行符生成空匹配。然后,匹配a,然后由于某种原因,字符串的结尾与另一个空匹配匹配。

如果您只想从每一行中提取非空白内容,那么您可以尝试以下方法:

print('ab\na'.match(/.+/g))
ab,a

答案 1 :(得分:1)

  

假设有空字符串,为什么一开始就没有字符串   最后......

.*适用于贪婪。它尽快吞下一条完整的线。一行我的意思是换行前的一切。遇到行尾时,由于星形量词,它会再次匹配。

如果你想要4,你可以将?添加到星形量词并使其变得懒惰.*?但是由于它们处理zero-length matches的方式,这个正则表达式因不同的风格而有不同的结果。 / p>

您可以在regex101中使用PCRE和JS引擎尝试.*?并查看差异。

<强>问题

您可能会问为什么引擎会尝试在行尾找到匹配项,而整个事情已经匹配了?

<强>答案

这是因为我们对行尾和字符串结尾有一个定义。所以不是整个事情都匹配。有一个左侧位置有机会匹配,我们有星形量词。

此左侧位置在此处为行尾,当$标志开启时,这是m的真实匹配。 .与此位置不匹配,但与.*.*?匹配,因为它们也是零长度位置的模式,就像任何X-STAR模式一样\d*\D*a*b?

答案 2 :(得分:0)

星号运算符*表示可以有任意数量的事件(甚至0次)。使用表达式,空字符串可以匹配。不确定你在寻找什么,但是+运算符(1个或更多次发生)可能更好?

想要添加更多信息,正则表达式默认使用贪婪算法(在某些语言中,您可以覆盖此行为),因此它将尽可能多地选择文本。在这种情况下,它会选择 a ,因为它可以使用正则表达式进行处理,因此“ \ na ”仍然存在。 “ \ n ”与“”不匹配,因此唯一可用的选项是空字符串。然后,我们将处理下一行,同样,我们可以匹配“ a ”。在此之后,只有空字符串与正则表达式匹配。

答案 3 :(得分:0)

  

*匹配前面的表达式0次或更多次。

     

。匹配除换行符之外的任何单个字符。

这就是官方文件所说的。和*。所以我猜你收到的阵列是这样的:

[ the first "any character" of the first line, following "nothing", the first "any character" of the second line, following "nothing"]

新线字符被忽略