我正在尝试使用正则表达式拆分逗号分隔的字符串。
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.
任何关于捕获所有项目的建议。
我正在尝试使用正则表达式拆分逗号分隔的字符串。
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.
任何关于捕获所有项目的建议。
使用否定字符类:
/([^,]+)/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"]
为什么不直接使用.split
?
>'hi,mr.007,bond,12:25PM'.split(',')
["hi", "mr.007", "bond", "12:25PM"]
如果出于某种原因必须使用正则表达式:
str.match(/(\S+?)(?:,|$)/g)
["hi,", "mr.007,", "bond,", "12:25PM"]
(注意包含逗号)。
如果您传递的是 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] }
此代码处理:
该模式包括:
(?:^|,)
匹配最后一列之后的行首或逗号,但不将其添加到组中
((?:[^",]|"[^"]*")*)
匹配列的值,包括:
一个收集组,它收集零个或多个字符,它们是:
[^",]
是不是逗号或引号的字符"[^"]*"
是一个双引号,后跟零个或多个以另一个双引号结尾的其他字符使用非收集组将它们或在一起:(?:[^",]|"[^"]*")
*
重复上述任意次数:(?:[^",]|"[^"]*")*
((?:[^",]|"[^"]*")*)
将双引号转义留给读者作为练习