【问题标题】:How to split a string by white space or comma?如何用空格或逗号分割字符串?
【发布时间】:2023-03-20 14:20:02
【问题描述】:

如果我尝试

"my, tags are, in here".split(" ,")

我得到以下信息

[ 'my, tags are, in here' ]

我想要

['my', 'tags', 'are', 'in', 'here']

【问题讨论】:

  • 你的意思不是空格逗号吗?
  • 作为对您得到的结果的解释:"my, tags are, in here".split(" ,") 将仅在空格 后跟 以逗号作为分隔符的情况下拆分字符串。您的字符串不包含该序列,因此它不会被拆分。 "my, tags are, in here".split(", ") 与拆分序列交换将至少将您的原始字符串拆分为三个部分,每个逗号和空格之后。如果您确实需要五个部分,下面的答案将匹配字符串指定为匹配空格 逗号的正则表达式。

标签: javascript


【解决方案1】:

String.split() 也可以接受正则表达式:

input.split(/[ ,]+/);

这个特殊的正则表达式拆分为一个或多个逗号或空格的序列,例如多个连续空格或逗号+空格序列不会在结果中产生空元素。

【讨论】:

  • @Bergi:嗯,它比我建议的更严格(前面只允许一个逗号)和比 OP 要求的更宽松(在所有空格上拆分)。恕我直言,情况会更糟——考虑输入spaces , before commas
  • @Jon:好的,这取决于 OP 的需求。我不会 plenk :-)
  • +1 我知道这有点老了,但为什么要使用空格而不是 \s。我可能在 blob 中有一些换行符,\s 也会处理这些。
  • FACEPALM 注意:不要在正则表达式周围加上引号。例如不要使用input.split("/[ ,]+/)"。保留引号(input.split(//) 而不是input.split("//")),您将获得更好的体验。因为奇怪的是,这真的可能只对自身起作用(生成["input.split(\"", ")\""])。
  • input.split(/[ ,]+/);
【解决方案2】:

你可以使用正则表达式来捕捉任意长度的空白,这就像:

var text = "hoi how     are          you";
var arr = text.split(/\s+/);

console.log(arr) // will result : ["hoi", "how", "are", "you"]

console.log(arr[2]) // will result : "are" 

【讨论】:

  • 使用 /\s+/ 时要注意前导/尾随空格。例如,'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ]。如果你先.trim() 字符串,你会很好。
【解决方案3】:

使用.split(/[ ,]+/) 的建议很好,但是使用自然句迟早会在数组中得到空元素。例如['foo', '', 'bar'].

如果这对您的用例没问题,那很好。但如果你想摆脱空元素,你可以这样做:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);

【讨论】:

  • 这是对原生对象隐式构造函数的一个非常巧妙的使用——我的电脑键盘今天早上疯了——我稍后会编辑这个评论——但重点是像“Boolean()”一样调用布尔值将构造一个新的[object Boolean] 的实例,其值为 false,就像调用“new Boolean()”一样。这将过滤掉所有匹配到这个默认行为。不错的一个:)
  • “自然句子”到底是什么意思?我无法模仿它,也不明白它应该做什么。
  • 由@VLostBoy 解释。当对任何值调用Boolean() 构造函数时,它将该值转换为布尔值——真或假。因此,任何虚假值都将从数组中过滤掉,包括空字符串。
  • 顺便说一句,您可以将隐式构造函数用于其他类似的有趣内容,例如 [1, 2, 3].map(String)
  • "foo, bar,,foobar,".split(/[\s,]+/) 返回["foo", "bar", "foobar", ""](因为末尾有悬空的逗号),谢谢!
【解决方案4】:
"my, tags are, in here".split(/[ ,]+/)

结果是:

["my", "tags", "are", "in", "here"]

【讨论】:

    【解决方案5】:

    input.split(/\s*[\s,]\s*/)

    \s* 匹配零个或多个空白字符(不仅是空格,还包括制表符和换行符)。

    ...[\s,] 匹配一个空格字符或一个逗号

    【讨论】:

    • 没有。这不好。这是输出:["my", "tags are", "in here"]
    • 它似乎在每个字符上分裂。
    • @Marco 哎呀。可能应该在我进行最后一次编辑之前对其进行测试。我现在有了,这次真的应该可以了。
    • @KaptajnKold 哦,我没听清楚,谢谢你的回答!
    • @leonheess 我不好意思说你是对的。我已经删除了答案中错误的部分。嘘!这个答案不是我最好的工作。我真的应该学会测试。
    【解决方案6】:

    当我想考虑逗号等额外字符时(在我的情况下,每个标记都可以用引号输入),我会执行 string.replace() 将其他分隔符更改为空白,然后在空格上拆分.

    【讨论】:

    • str_variable.replace(/[,'"]+/gi, ' ').split(' ')
    【解决方案7】:

    当您需要使用一些单个字符分隔符分割字符串时,请考虑使用反向逻辑:匹配由分隔符字符以外的字符组成的字符串块。

    因此,要提取除空格(与\s 匹配)和逗号以外的所有字符块,您可以使用

    console.log("my, tags are, in here".match(/[^\s,]+/g))
    // => ["my","tags","are","in","here"]

    请参阅regex demoString#match 提取除空格和逗号 ([^\s,]) 之外的一个或多个 (+) 字符的所有非重叠出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多