具有RegExp正则表达式(/ \ s * $ /)的JavaScript拆分功能

时间:2019-07-04 04:14:32

标签: javascript regex

这是关于使用正则表达式作为分隔符在字符串末尾进行分隔

console.log('ab '.split(/\s*$/));

  

输出:['ab','']

但是如果我删除结尾空格

console.log('ab'.split(/\s*$/))

  

输出:['ab']

为什么第二个在输出中不包含“”?

2 个答案:

答案 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*$/)时,它只会在模式匹配时分开。