【问题标题】:Split the sentences by ',' and remove surrounding spaces用“,”分割句子并删除周围的空格
【发布时间】:2011-12-03 12:06:33
【问题描述】:

我有这个代码:

var r = /(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*){0,}$/
var s = "   a   ,  b  , c "
var m = s.match(r)
m => ["   a   ,  b  , c ", "a", "c"]

看起来整个字符串都已匹配,但"b" 去哪儿了?我宁愿期望得到:

["   a   ,  b  , c ", "a", "b", "c"]

这样我就可以使用m.shift() 得到类似s.split(',') 的结果,但也可以删除空格。

是我的正则表达式有误还是我误解了String.prototype.match

【问题讨论】:

  • 附带说明,{0,}* 相同。
  • 好吧,s 也可能是 ' a, c''a,b,c d e, f'
  • 我将空格改为\s

标签: javascript regex


【解决方案1】:

您可以根据自己的目的执行此操作
编辑:按照 cmets 中的建议删除第二个替换。 s.replace(/^\s*|\s*$/g,'').split(/\s*,\s*/)
首先 replace 修剪字符串,然后 split 函数围绕 '\s*,\s*' 拆分。这会在输入" a , b , c " 上给出输出["a", "b", "c"]

至于为什么您的正则表达式没有捕获“b”,您正在重复捕获的组,因此只有最后一次出现被捕获。更多信息在这里http://www.regular-expressions.info/captureall.html

【讨论】:

  • 我不想删除所有空格,只删除逗号周围或字符串开头/结尾处的空格
  • @Andrew 不都是空格吗?或者你有想要拆分的句子吗?
  • s.replace(/^\s*/, '').replace(/\s*$/, '').split(/\s*,\s*/) 可以这个
  • @Andrew 根据您的要求更改了答案。
【解决方案2】:

简答:使用m = s.match(/[^ ,]/g);


您的 RE 无法按预期工作,因为最后一组匹配最近的匹配 (=c)。如果省略 {1,}$,则返回的匹配项将为 " a , b ", "a", "b"。简而言之,您的 RegExp 确实返回与指定组一样多的匹配项除非您使用 global 标志 /g。在这种情况下,返回的列表包含对所有匹配子字符串的引用。

为了达到你的效果,使用:

m = s.replace(/\s*(,|^|$)\s*/g, "$1");

此替换替换每个逗号 (,)、开头 (^) 和结尾 ($),并由空格、原始字符(comma 或什么都没有)包围。

如果要获取数组,请使用:

m = s.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/);

此 RE 修剪字符串(删除开头和结尾的所有空格,然后将字符串按<any whitespace>,<any whitespace> 分割。请注意,空格字符还包括换行符和制表符。如果您想坚持仅使用空格,请使用一个空格 () 而不是 \s

【讨论】:

  • @Andrew 我已经扩展了你的 RE 的解释。请参阅我的第二个示例以了解 split 方法。
  • 我已经将它作为对另一个答案的评论发布。我想知道,我可以用一个正则表达式和一个操作来完成还是 js 正则表达式不够聪明?
  • @Andrew 是的,只需使用 s.match(/[^ ,]+/g)。正如我的答案顶部提到的,/g 是全局标志,它返回所有匹配的子字符串。
  • @Andrew:无论您添加多少量词,一个捕获组都会创建一个匹配项。如果要匹配abc,则需要三对括号(不包括(?:...)):/(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)$/
  • @RobW, s.match(/[^ ,]+/g) 完全符合我的需要,请将其添加到您的答案中
【解决方案3】:

所以最后我选择了/(?=\S)[^,]+?(?=\s*(,|$))/g,它提供了我所需要的:所有句子都用“,”分隔,周围没有空格。

'       a,    OMG     abc b a b, d o WTF        foo     '.
  match( /(?=\S)[^,]+?(?=\s*(,|$))/g )
=> ["a", "OMG     abc b a b", "d o WTF        foo"]

非常感谢!

【讨论】:

  • 这是我理解的意思。如果我不对,请纠正我:(?=\S) - 仅在前面没有空格时才开始捕获 [^,]+ - 尽可能多地捕获“非逗号”? - 但不要捕获可以捕获的内容由下一组(?=\s*(,|$)) - 捕获逗号或字符串结尾之前的所有空格/g - 重复所有字符串
【解决方案4】:

这是一种非常简单直接的方法,无需复杂的正则表达式。

var str = "   a   ,  b  , c "
var arr = str.split(",").map(function(item) {
  return item.trim();
});
//arr = ["a", "b", "c"]

IE9 及更高版本支持原生.maphttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map


或者在 ES6+ 中它会变得更短:

var arr = str.split(",").map(item => item.trim());

为了完成,这里是带有打字信息的打字稿

var arr: string[] = str.split(",").map((item: string) => item.trim());

【讨论】:

  • 为了挑剔,你可以去掉 map 参数周围的大括号:var arr = str.split(",").map(item=>item.trim());
  • 我和@DavidJones 一起讨论这个问题。如果你修改你的答案会很棒。对我的案子帮助很大,谢谢你们!
  • 是的,好点 - 答案已更新以反映这一点!不过,我个人总是添加括号,因为我通常编写 Typescript,并且我喜欢提供明确的类型信息,这样您就可以一目了然地知道是什么。
  • 这是一个很好的答案,克里斯。
  • 简单最好的!!
【解决方案5】:

你可以在没有复杂的正则表达式的情况下试试这个。

var arr = "   a   ,  b  , c ".trim().split(/\s*,\s*/);
console.log(arr);

【讨论】:

    【解决方案6】:

    ES6 速记:

    str.split(',').map(item=>item.trim())
    

    【讨论】:

      【解决方案7】:

      如果您想继续使用正则表达式,请保持代码简单且不使用 ES6:

      s.replace(/ /g, '').split(",")
      

      1 - 将所有空格 (/ /g) 替换为空字符串 ('')

      2 - 然后将其拆分为一个数组

      等等

      【讨论】:

      • 这是最好的、最简单的答案。
      【解决方案8】:

      如果逗号分隔列表有大量值,也可以使用下面的 sn-p:

      data.trim().split(/\s*,\s*/)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-02
        • 2018-08-03
        • 2021-07-06
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        相关资源
        最近更新 更多