search

Home  >  Q&A  >  body text

javascript正则表达式对字符串分组时产生空字符串组?

javascript 分割字符串,将汉字和非汉字分割出来,

'张sdf四上法asdf翁芬aa33网s'.split(/([\u4e00-\u9fa5]{1})/gi);

但返回的结果数组里却多出来几个空字符串:

["", "张", "sdf", "四", "", "上", "", "法", "asdf", "翁", "", "芬", "aa33", "网", "s"]

请问这个空字符串是怎么出来的?应该如何去除?

首页感谢@KevinYue和@皓矾的回答,我的需求其实是把单个汉字分割出来,而且汉字和非汉字的分割要保证顺序,其实我也有其他的方法做,但我真正的问题是:原来的正则表达式为什么会多出几个空字符串?我一直没想明白,所以期望有人能解释一下。

PHPzPHPz2832 days ago589

reply all(3)I'll reply

  • 高洛峰

    高洛峰2017-04-10 14:39:03

    你的目的是把汉字非汉字分隔出来,可以换一种思路,不知是否满足你的要求:

    //提取汉字,输出["张", "四上法", "翁芬", "网"]
    '张sdf四上法asdf翁芬aa33网s'.match(/([\u4e00-\u9fa5]+)/g);
    
    //提取非汉字,输出["sdf", "asdf", "aa33", "s"]
    '张sdf四上法asdf翁芬aa33网s'.match(/([^\u4e00-\u9fa5]+)/g);
    

    这样也不会出现空字符串了。


    补充

    为什么会多出几个空字符

    针对这个问题,我整理了一篇文章做了详细介绍,请移步JavaScript拆分字符串时产生空字符的原因

    该如何去除

    如果你看了上面的文章,你应该明白不好去除。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:39:03

    这样也行吧?不过估计有更简化的写法。我忘了有没有直接前前一个匹配项取反了……

        "张sdf四上法asdf翁芬aa33网s".match(/([\u4e00-\u9fa5]{1,})|([^\u4e00-\u9fa5]{1,})/gi);
        // 输出["张", "sdf", "四上法", "asdf", "翁芬", "aa33", "网", "s"]
    

    如果是要每个字符都分开是这样

        "张sdf四上法asdf翁芬aa33网s".match(/([\u4e00-\u9fa5]{1})|([^\u4e00-\u9fa5]{1, })/gi);
        // 输出["张", "sdf", "四", "上", "法", "asdf", "翁", "芬", "aa33", "网", "s"]
    

    至于为什么会出现多余的空字符串,其实是String.prototype.split使用正则表达式做为separator造成的,举个最简单的例子:

        "abc".split(/([a-z])/gi);
        // 输出["", "a", "", "b", "", "c", ""]
    

    时间不多,具体String.prototype.split的实现源码还没来得及看,但问题是出在它身上。

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 14:39:03

    document.write( '张sdf四上法asdf翁芬aa33网s'.split( /1*/ ) );
    输出:张,四,上,法,翁,芬,网,
    这样可以分开汉字但是最后一个有空字符,最后一个空字符无法避免。
    因为
    •当原始字符串S匹配过一次分隔符之后,紧接着,字符串S的下一个位置还匹配分隔符。如:'abbbc'.split('b'),'abbbc'.split(/(b){1}/)
    •另一种情况是字符串开头的一个或几个字符匹配分隔符。如:'abc'.split('a'),'abc'.split(/ab/)
    •还有一种情况是字符串结尾的一个或几个字符串匹配分隔符,与之相关的步骤是第14步。
    如:'abc'.split('c'),'abc'.split(/bc/)
    此外,当使用正则表达式作为分隔符的时候,返回的结果中还有可能出现undefined。
    如:'abc'.split(/(d)*/)
    至于为什么会出现空字符,我贴出链接,可以了解一下
    链接描述


    1. u4e00-u9fa5 ↩

    reply
    0
  • Cancelreply