问题描述
使用JavaScript的split方法拆分字符串时出现一些空字符串"",尤其是当使用正则表达式作为分隔符的时候。
相关问题
javascript正则表达式对字符串分组时产生空字符串组?
在上面这个问题中,题主使用正则表达式对字符串进行分割时产生了多个空字符串"",代码如下:
代码如下:
'张sdf四上法asdf翁芬aa33网s'.split(/([/u4e00-/u9fa5]{1})/gi);
//输出["", "张", "sdf", "四", "", "上", "", "法", "asdf", "翁", "", "芬", "aa33", "网", "s"]
那么,产生这些空字符串的原因是什么?
问题分析
在Google上搜索了一番,发现相关的结果并不多,即便有,详细解释的也不多,大概的说了一下,然后就给出了一个ECMAScript规范的链接。看来要想知道真正的原因,就只能硬着头皮看规范了。
相关标准
那么,接下来,按照国际惯例,先上ECMAScript的标准镇楼。
代码如下:
String.prototype.split (separator, limit)
这个章节详细介绍了split方法的执行步骤,如果感兴趣的话可以一步一步的认真看完,我在这里只把和产生空字符串相关的步骤拿出来解释一下,不当之处,欢迎大家提出。
相关步骤
摘取部分步骤:
整个过程中最主要的步骤是第13步这个循环,而这个循环主要做的事情如下:
•定义p, q的值,每一次循环开始的时候p和q的值是相同的(该步骤在循环之外);
•调用SplitMatch(S, q, R)这个方法对字符串进行拆分;
•根据返回结果的不同,执行不同的分支,主要分支为分支ⅲ;
•分支ⅲ又分成了8个小步用来将返回的结果填充到事先定义好的数组A中
•在这个8小步中,步骤1的作用是返回原始字符串的一个子串,开始位置是p(包含在内),结束位置是q(不包含在内),注意:在这一步中会产生空字符串,我将其标记为截取字符串,方便下文引用。
•将上一步的子串添加到数组A中
•接下来的几步是更新相关的变量,继续下一次循环。(步骤7的作用是将正则表达式中的捕获分组保存到数组A中,和产生空字符串无关)
SplitMatch(S, q, R)
接下来,我们需要了解一下SplitMatch(S, q, R)这个方法做了些什么事。这个方法在split规范中的下方有提及。它主要做的事是,根据分隔符(separator)的类型进行相应的操作:
•如果分隔符是RegExp类型的,调用RegExp的内部方法[[Match]]来对字符串进行匹配,如果匹配失败,返回failure,否则,返回一个MatchResult类型的结果。
•如果分隔符是字符串,进行匹配判断,失败返回failure,成功返回MatchResult类型的结果。
新闻热点
疑难解答
图片精选