Javascript拆分字符串时生成空字符的解决方案
问题描述使用Javascript拆分字符串时,有一些空字符串 ,特别是当正则表达式用作分隔符时。
相关问题
Javascript正则表达式在分组字符串时产生空字符串组
在上述问题中,当正则表达式用于分段字符串时,标题所有者产生多个空字符串。代码如下:
复制代码代码如下所示:
Zhang SDF四,asdf Weng Fen aa33净的。分裂( /({ u4e00 - u9fa5 } { 1 }) / GI);
{输出
那么,产生这些空字符串的原因是什么呢
问题分析
在谷歌上搜索,我们发现没有太多相关的结果。即使没有了很多解释,我可能给一个链接到ECMAscript规范。似乎知道真正的原因,只能硬看标准。
相关标准
然后,接下来,按照国际惯例,去ECMAscript标准建设第一镇。
复制代码代码如下所示:
String.prototype.split(分离器、极限)
本章详细介绍了分割方法的实现步骤。如果你对它感兴趣,你可以一步一步地读它。这里我只解释与生成空字符串相关的步骤,我想欢迎您。
相关步骤
采取步骤:
整个过程中最重要的步骤是第十三步,而这个周期的主要内容如下:
定义p、q的值,p和q的值在每个周期的开始时是相同的(步骤在循环的外面);
该方法被称为SplitMatch(S,Q,R)拆分字符串。
根据返回结果的不同,执行不同的分支,主要分支是分支;
分支III被分成8个小步骤,以将返回的结果填充到前面定义的数组A中。
在8步中,步骤1的作用是原始字符串字符串的一个子集开始返回,位置是p(包含),结束位置是q(不包括),注意:在这个步骤中生成一个空字符串,我将它标记为字符串,引用如下。
添加的子串的最后一步的阵列
下一步是更新相关变量并继续下一个循环(步骤7的作用是将正则表达式中的捕获组保存为数组A,与空字符串的生成无关)。
SplitMatch(S,Q,R)
接下来,我们需要知道的splitmatch(S,Q,R)的方法做了。这种方法是下面提到的分规范。最重要的是要根据分离器的类型做相应的操作。
如果分离器regexp类型,表达式的内部方法{ { } }匹配来匹配字符串。如果匹配失败,则返回失败,否则,由于MatchResult类型返回。
如果分离是一个字符串,匹配判断,失败返回失败,和的MatchResult类型返回的结果是成功的。
MatchResult
以上步骤也导致的MatchResult类型的一个变量,通过检查文件发现,这种类型的变量有两个属性指定捕获,字符串匹配位置加1是指定值,捕捉可以理解为一个数组,当分隔的正则表达式,哪些元素是数据包捕获的价值;当分隔符的字符串,它是一个空数组。
下一个
从上面的步骤中可以看到,拆分字符串是在截取字符串的步骤中产生的(除了正则表达式的组捕获),它的作用是截取指定起始(包含)和结束位置(不包括)之间的字符串,以及何时返回到 一个特殊的情况是,开始和结束位置的值相等,这只是一个猜测,因为规范没有给出拦截字符串的标准步骤。
都在这里。你为什么不向前走一步呢
所以,我试着搜索一些V8源代码,看看是否能找到一个具体的实现。
他们中的一些被带到这里:
复制代码代码如下所示:
函数的StringSplitJS(分离器、极限){
…
…
字符串分隔符
如果(!is_regexp(分离器)){
无功separator_string = to_string_inline(分离器);
如果(限制= 0){返回;
说如果分离器/ ECMA-262定义,结果
包含整个字符串的数组大小为1。
如果(is_undefined(分离器)){ }回归主题;
无功separator_length = separator_string.length;
分隔符是一个空字符串,直接返回到字符数组。
如果(separator_length = 0)返回% stringtoarray(主体、限制);
VaR结果= % stringsplit(主体、separator_string,限制);
返回结果;
}
如果(限制= 0){返回;
/ /分隔符是一个正则表达式,称stringsplitonregexp
返回StringSplitOnRegExp(主体、分离器、限制、长度);
}
这里省略了一些代码
在我的代码中,我发现当我填写的阵列,我称为_substring截取字符串。不幸的是,我没有找到他的定义。如果有任何的同学,请让我知道。不过,我发现stringsubstring在Javascript字符串对应的方法称为_substring方法并返回结果。所以if'abc'。子串(1,1),回归表明,% _substring方法的开始和结束时的同一位置回归
那么,什么时候开始位置等于位置的结束位置(Q = P)我一步步地分析了这些步骤,最后发现:
当原始字符串的匹配字符串的分隔符,然后下一个位置匹配的分隔符。如:'abbbc'。分(B),'abbbc。分裂( /(B){ 1 } /)
另一个例子是一个或几个字符在字符串的开头匹配分隔符。如:ABC。分裂('a'),ABC的分裂( / / AB)
另一个例子是一个或多个字符串在字符串的结尾匹配分隔符,这是第十四步相关。
如:ABC。分(C),ABC的分裂(公元前 / /)
此外,当使用正则表达式作为分隔符,不可能在返回结果。
如:ABC。分裂((D) / /)
回头看例子的开头,是否满意
题外话
这是我第一次看ECMAscript标准规范和过程真的很痛苦,但感觉很痛苦后,我知道了。我也感谢主人的问题和问题。
顺便说一下,全球改性剂G时忽略正则表达式作为分隔符使用,这是一个额外的收获。