【问题标题】:Splitting string by regular expression通过正则表达式拆分字符串
【发布时间】:2017-09-22 13:23:08
【问题描述】:

我有以下代码sn-p:

var colorText = "red,blue,green,yellow";
var colors3 = colorText.split(/[^\,]+/);
alert(colors3); // ["", ",", ",", ",", ""]

我不明白这里发生了什么。据我了解,正则表达式将匹配字符串开头的任何逗号,并且匹配这些字符串中的一个或多个。当我们将这个正则表达式作为参数提供给split 时会发生什么?当然,如果我们只是尝试将正则表达式与colorText 匹配,我们将得不到匹配,因为起始字符不是逗号。但是提供给split 的正则表达式如何导致逗号数组和每边两个空字符串?

【问题讨论】:

  • 你要分割的是什么?此外,这是一个字符组,它不是“字符串开头”,而是“所有内容,但不是逗号”,您必须将 ^ 移出字符组以匹配字符串开头。
  • 首先你的正则表达式是关闭的。 ^ 运算符将匹配除逗号之外的所有内容。您还需要添加标志 g,以便您的正则表达式看起来像这样 /[\,]+/g。这将匹配字符串中的所有逗号
  • 插入符号必须在正则表达式的开头,您所做的是排除多个逗号

标签: javascript regex


【解决方案1】:

当您可以简单地执行 split(',') 时,为什么还需要正则表达式?

var colorText = "red,blue,green,yellow";
var colors3 = colorText.split(',');
console.log(colors3);

如果您想选择除逗号以外的所有内容,那么使用match 可能是一个更好的主意。

var colorText = ",red,blue,green,yellow";
var colors3 = colorText.match(/[^\,]+/g);
console.log(colors3);

【讨论】:

  • 看起来,op 想要阻止以逗号开头的拆分并在数组中获取一个空项。
  • @NinaScholz 我用你的建议更新了答案,但我看到你也回答了。
【解决方案2】:

MDN web docs [^xyz] 中所述

否定或补充字符集。也就是说,它匹配任何未包含在括号中的内容。

您的正则表达式 /[^\,]+/ 将匹配任何不包含任何逗号的字符序列。

所以您的正则表达式将匹配colorText 中的这些序列:

  • red
  • blue
  • green
  • yellow

split 函数将在这些序列处拆分 colorText

但是,如果您想在每个逗号处拆分字符串,请使用:

colors = colorText.split(',');

【讨论】:

    【解决方案3】:

    如果您想防止拆分时出现空项目,您可以使用String#match 而不是String#split 和匹配除逗号之外的所有字符的正则表达式。

    var regex = /[^,]+/g;
    
    console.log(",red,blue,green,yellow,".match(regex));
    console.log("red,blue,green,yellow".match(regex));
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案4】:

      所以,我的目标不是用逗号分隔字符串中的单词。我在一本书中找到了这段代码,并想理解它。我犯的错误是我认为^ 匹配字符串的开头,而实际上它的意思是方括号内的“除了”之外的任何内容。现在我知道正则表达式匹配任意数量的非逗号字符,这就是告诉split() 在每个列表元素中放入什么的原因。第一个和最后一个元素是空字符串,因为它分别位于第一个和最后一个单词的左侧和右侧。

      【讨论】:

        【解决方案5】:

        您必须从 var colors3 = colorText.split(/[^\,]+/); 中删除插入符号 ^ 才能正常工作:

        var colorText = "red,blue,green,yellow";
        var colors3 = colorText.split(/[\,]+/);
        console.log(colors3);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多