Javascript正则表达式在逗号分隔的字符串中拆分单词

时间:2013-02-28 19:19:01

标签: javascript regex

我正在尝试使用正则表达式分割逗号分隔的字符串。

var a = 'hi,mr.007,bond,12:25PM'; //there are no white spaces between commas
var b = /(\S+?),(?=\S|$)/g;
b.exec(a); // does not catch the last item.

任何关于捕获所有物品的建议。

3 个答案:

答案 0 :(得分:9)

使用否定的字符类:

/([^,]+)/g

将匹配非逗号组。

< a = 'hi,mr.007,bond,12:25PM'
> "hi,mr.007,bond,12:25PM"
< b=/([^,]+)/g
> /([^,]+)/g
< a.match(b)
> ["hi", "mr.007", "bond", "12:25PM"]

答案 1 :(得分:5)

为什么不使用.split

>'hi,mr.007,bond,12:25PM'.split(',')
["hi", "mr.007", "bond", "12:25PM"]

如果必须出于某种原因使用正则表达式:

str.match(/(\S+?)(?:,|$)/g)
["hi,", "mr.007,", "bond,", "12:25PM"]

(请注意包含逗号)。

答案 2 :(得分:0)

如果传递的是CSV文件,则某些值可能会在其周围加上双引号,因此您可能需要一些更复杂的内容。例如:

Pattern splitCommas = java.util.regex.Pattern.compile("(?:^|,)((?:[^\",]|\"[^\"]*\")*)");

Matcher m = splitCommas.matcher("11,=\"12,345\",ABC,,JKL");

while (m.find()) {
    System.out.println( m.group(1));
}

或在Groovy中:

java.util.regex.Pattern.compile('(?:^|,)((?:[^",]|"[^"]*")*)')
        .matcher("11,=\"12,345\",ABC,,JKL")
            .iterator()
                .collect { it[1] }

此代码处理:

  • 空白行(上面没有值或逗号)
  • 空列,包括最后一列为空
  • 处理用双引号引起来的值,包括双引号内的逗号
  • 但不能处理用于转义双引号本身的两个双引号

该模式包括:

  • (?:^|,)与行的开头或最后一列之后的逗号匹配,但不会将其添加到组中

  • ((?:[^",]|"[^"]*")*)与该列的值匹配,并且由以下内容组成:

    • 一个收集组,该收集组收集零个或多个以下字符:

      • [^",]是不是逗号或引号的字符
      • "[^"]*"是双引号,后跟零个或多个其他字符,并以另一个双引号结尾
    • 使用非收集组将它们“或”在一起:(?:[^",]|"[^"]*")

    • 使用*重复上述任意次数:(?:[^",]|"[^"]*")*
    • 进入收集组以提供列值:((?:[^",]|"[^"]*")*)

将双引号转义留给读者练习