用','拆分句子并删除周围的空格

mea*_*dre 61 javascript regex

我有这个代码:

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"]
Run Code Online (Sandbox Code Playgroud)

看起来整个字符串已匹配,但哪里已经"b"消失了?我宁愿期望得到:

["   a   ,  b  , c ", "a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

所以我可以m.shift()用一个结果,s.split(',')但也删除空格.

我在regexp中有错误还是我误解了String.prototype.match

CBa*_*arr 137

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

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

.mapIE9及以上版本支持本机:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map


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

var arr = str.split(",").map(item => item.trim());
Run Code Online (Sandbox Code Playgroud)

为了完成,这里是在Typescript中输入信息

var arr: string[] = str.split(",").map((item: string) => item.trim());
Run Code Online (Sandbox Code Playgroud)

  • 只是为了挑剔,你可以取消地图参数周围的大括号:`var arr = str.split(",").map(item => item.trim());` (3认同)

Die*_*itz 28

ES6 简写:

str.split(',').map(item=>item.trim())
Run Code Online (Sandbox Code Playgroud)


Rob*_*b W 14

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


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

要达到您的效果,请使用:

m = s.replace(/\s*(,|^|$)\s*/g, "$1");
Run Code Online (Sandbox Code Playgroud)

这个替换用原始字符(或什么都没有)替换每个逗号(,),开头(^)和结束($),由空格包围comma.

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

m = s.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/);
Run Code Online (Sandbox Code Playgroud)

这个RE修剪字符串(删除开头和结尾的所有空格,然后将字符串拆分<any whitespace>,<any whitespace>.注意,空格字符还包括换行符和制表符.如果你想坚持只使用空格,请使用空格() instead of \s.


xfg*_*xfg 14

你可以尝试这个没有复杂的正则表达式.

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


Nar*_*ala 7

您可以为此目的执行此操作
编辑:删除注释中建议的第二个替换. 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


mea*_*dre 7

所以最后我去了/(?=\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"]
Run Code Online (Sandbox Code Playgroud)

非常感谢!


Alb*_*tSY 5

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

s.replace(/ /g, '').split(",")
Run Code Online (Sandbox Code Playgroud)

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

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

等等