需要使用正则表达式从字符串中提取值(出于性能原因)。案件可能如下:
生成的分隔[label,value]数组应为:
我甚至研究了解决方案和流行的库,只需将整个字符串拆分以获取值,例如'RED,100'.split(/,/)可能就是这样做的。
但是我试图使用逗号创建一个正则表达式,只有当逗号不包含在引号类型值中时才会拆分。
这不是标准的CSV行为。但最终用户输入值非常容易。输入标签,价值。做任何内部价值,如果那被报价包围。如果您想包含引号,请使用反斜杠。
任何帮助表示赞赏。
您可以使用此正则表达式来处理字符串中的转义引号:
/"[^"\\]*(?:\\.[^"\\]*)*"|[^,"]+/g
RegEx说明:
"
:匹配文字开头报价[^"\\]*
:匹配任何不是\
而不是引用的任何字符的0或更多(?:\\.[^"\\]*)*
:跟随逃脱的角色和另一个非引用,非\
。匹配此组合中的0或更多以通过所有转义字符"
:匹配收盘报价|
:OR(交替)[^,"]+
:匹配非引号,非逗号字符串的1+const regex = /"[^"\\]*(?:\\.[^"\\]*)*"|[^,"]+/g;
const arr = [`RED,100`, `RED,"100"`, `RED,"100,"`,
`RED,"100\\"ABC\\"200"`];
let m;
for (var i = 0; i < arr.length; i++) {
var str = arr[i];
var result = [];
while ((m = regex.exec(str)) !== null) {
result.push(m[0]);
}
console.log("Input:", str, ":: Result =>", result);
}
您可以使用String#match
并仅使用组。
var array = ['RED,100', 'RED,"100"', 'RED,"100,"', 'RED,"100\"ABC\"200"'];
console.log(array.map(s => s.match(/^([^,]+),(.*)$/).slice(1)))