用“,”分隔句子并删除周围的空格


82

我有这个代码:

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,}与相同*
pimvdb 2011年

好吧,s也可能是' a, c''a,b,c d e, f'
意味着

我将空格更改为\ s
Meandre,2011年

Answers:


190

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

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

.mapIE9及更高版本支持本机:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map


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

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

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

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

4
只是要挑剔,您可以删除地图参数周围的花括号: var arr = str.split(",").map(item=>item.trim());
David Jones

我与@DavidJones在一起。如果您修改答案,那就太好了。我的案子对我有很大帮助,谢谢大家!
已于

是的好点-更新答案以反映这一点!由于我通常是在编写Typescript,因此我个人总是添加括号,并且我希望提供明确的类型信息,以便您始终可以一目了然。
CBarr

克里斯,这是一个很好的答案。
周期性的

简单而最好!!
Rahul Sonwanshi

22

您可以在不使用复杂的正则表达式的情况下进行尝试。

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


15

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


您的RE不能正常工作,因为最后一组匹配最近的匹配(= c)。如果您省略{1,}$,则返回的匹配为" a , b ", "a", "b"。简而言之,除非使用globalflag,否则RegExp确实会返回与指定组一样多的匹配项/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方法示例。
罗布W

我已经将其发布为对另一个答案的评论。我想知道,我可以用一个正则表达式和一个操作或js正则表达式不够聪明吗?
卑鄙的

@Andrew是的,只需使用即可s.match(/[^ ,]+/g)。如我的答案顶部所述,/g就是全局标志,它返回所有匹配的子字符串。
罗布W

@Andrew:无论您添加多少个量词,一个捕获组都会创建一个匹配项。如果要与和匹配a,则需要三对括号(不包括):bc(?:...)/(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)$/
user123444555621 2011年

@RobW,s.match(/ [^,] + / g)完全按照我的需要工作,请将其添加到您的答案中
Meandre 2011年


8

您可以根据自己的目的执行此操作
EDIT:按照注释中的建议删除第二个替换项。 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不是所有的空格吗?还是您想拆分句子?
David Hellsing

s.replace(/ ^ \ s * /,'').replace(// s * $
/,'').split(/

@Andrew根据您的要求更改了答案。
Narendra Yadala 2011年

6

所以最后我选择了/(?=\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-在所有字符串中重复
2011年

1

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

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

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

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

埃特沃伊拉


这是最好的,最简单的答案。
开拓者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.