这是关于使用正则表达式作为分隔符在字符串末尾进行分隔
console.log('ab '.split(/\s*$/));
输出:['ab','']
但是如果我删除结尾空格
console.log('ab'.split(/\s*$/))
输出:['ab']
为什么第二个在输出中不包含“”?
答案 0 :(得分:2)
这里发生的是,给定输入/\s*$/
时,您的正则表达式"ab"
实际上等效于/$/
,因为*
量词在零< / strong>,次数不受限制。
因此,此正则表达式将仅与输入中各行末尾的空字符串匹配,如以下多行版本所示:
const input = `abc
def
ghi`;
// this will preserve the `\n` new line characters, because we split on the empty `/$/`
console.log(input.split(/\s*$/m));
但是,ECMAScript definition of String.split()
有一个特殊注释,涉及使用正则表达式进行拆分的情况,正则表达式可能与空字符串匹配,其内容为:
分隔符的值可以是空字符串,空正则表达式或可以匹配空字符串的正则表达式。在这种情况下,分隔符与输入字符串的开头或结尾处的空子字符串不匹配,也与上一个分隔符匹配的末尾的空子字符串不匹配。
因此,这表示我们输入中的第一个和最后一个空字符串都将被丢弃(否则,"ab".split('')
将返回["", "a", "b", ""]
)。
因此,最后我们可以将其示意图化为
"ab"
| // should split here
["ab", ""]
// but we have to discard first and last empty strings
["ab"]
您会发现/^/
正则表达式也会发生
console.log("ab".split(/^/))
答案 1 :(得分:0)
split
将字符串转换为新数组中的子字符串数组。例如-
"ab cd".split(" ")
结果:["ab", "cd"]
它将在空白" "
处分开。但是如果没有空格,它将创建包含主字符串的数组。例如-
"abcd".split(" ")
结果:["abcd"]
现在是正则表达式的一部分。
\s
用于查找空格字符。
'ab '.split(/\s/)
结果["ab", ""]
和
'ab'.split(/\s/)
个结果["ab"]
第一个字符串包含一个空格,它将字符串分成两个子字符串,但是第二个字符串不包含空格,因此不创建子字符串。
n*
与包含零个或多个n的任何字符串匹配。
因此,\s*
与包含零个或多个空格字符的任何字符串匹配。
'ab '.split(/\s*/)
结果["a", "b", ""]
和
'ab'.split(/\s*/)
个结果["a", "b"]
由于第一个字符串包含一个空白和一个零空白(共两个),因此它将字符串分成三个子字符串。但“第二字符串”仅包含一个零空白,因此会创建两个子字符串。
n$
量词匹配任何以n结尾的字符串。
所以\s*$
匹配字符串中至少有一个空格的任何字符串。因为它将仅在空格的末尾匹配,所以如果没有空格,则将没有结尾。因此,它将不匹配。
'ab '.split(/\s*$/)
结果["ab", ""]
和
'ab'.split(/\s*$/)
个结果["ab"]
由于第一个字符串包含一个空格,因此它将字符串分成两个子字符串,但是由于第二个字符串中没有空格,因此不会创建任何子字符串。
简而言之,(/\s*$/)
模式在空格的末尾搜索任何空格。当您使用split(/\s*$/)
时,它只会在模式匹配时分开。