var a = 'a\na'
console.log(a.match(/.*/g)) // ['a', '', 'a', '']
为什么结果中有两个空字符串?
假设有空字符串,为什么在每行的开头和结尾都没有,因此有4个空字符串?
我不是在寻找如何选择'a'而只是想了解空字符串的存在。
答案 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"]
新线字符被忽略