我想要分割字符串的JS正则表达式,但在一种情况下也保留分隔符,但在其他情况下丢弃

时间:2018-04-13 04:14:40

标签: javascript regex

我正在使用此正则表达式来分割字符串

(/\:|(#[0-9]*\s*)|\s*\|\s*|\s*\/\s*/)

用于标识冒号:或表达式#1或管道符号|或正斜杠/

案例1:如果是:/|,我想拆分字符串并删除这些符号。

案例2:在模式#12的情况下,我想将这个模式保留在数组中,也就是我们在分割之后得到的

所以我有字符串#12 start|hello hi/bye : end 分裂功能应该给我一个像['#12;#39;开始','你好',' hi',' ;再见'。]

这里的问题是使用表达式(#[0-9]*\s*)按需要拆分数组,给出数组中的模式,但也在数组中给出undefined。使用没有像#[0-9]*\s*这样的括号的分割数组,不会给出未定义的,但也不会给出数组中的模式#12。

PS:我上面引用的例子只是为了解释问题的背景。

2 个答案:

答案 0 :(得分:0)

结果数组中的Emtpy项目将以这种方式出现,因为这就是split的工作原理:一旦找到匹配,之前的子字符串被推送到数组甚至如果它是一个空字符串。因此,在随后的匹配之间,您将始终获得这些空项目。

您可以使用

/\s*(?:(#[0-9]+)|[:\/|])\s*/

并删除所有空字符串.filter(Boolean)



console.log(
 '#12 start|hello hi/bye : end'.split(/\s*(?:(#[0-9]+)|[:\/|])\s*/).filter(Boolean)
);




请参阅regex demo

<强>详情

  • \s* - 0+ whitespaces
  • (?: - 两种选择中的任何一种:
    • (#[0-9]+) - 第1组(将添加到输出中):#和1+位数
    • | - 或
    • [:\/|] - :/|
  • ) - 小组结尾
  • \s* - 0+空格。

答案 1 :(得分:-1)

请尝试使用此模式。

`#12 start|hello hi/bye : end`.split(/[^\w#]+/);

除了#之外,它基本上按非字字符序列拆分字符串。这种模式实际上更容易阅读和修改。