使用正则表达式,从javascript

时间:2018-01-18 15:19:32

标签: javascript regex string

需要使用regex从字符串中提取值(出于性能原因)。 案例可能如下:

  1. RED,100
  2. RED, “100”
  3. RED, “100”
  4. RED “100 \” ABC \ “200”
  5. 生成的分隔[label,value]数组应为:

    1. [ 'RED', '100']
    2. [ 'RED', '100']
    3. [ 'RED', '100,']
    4. [ 'RED', '100 “ABC” 200']
    5. 我研究了解决方案和流行的库,只需将整个字符串拆分以获取值, 例如'RED,100'.split(/,/)可能就是这样做的。

      但是我试图用逗号创建一个正则表达式,只有当逗号没有包含在引号类型值中时才会分裂。

      这可能不是标准的CSV行为。但最终用户输入值非常容易。 输入标签,价值。做任何内部价值,如果那被报价包围。如果您想包含引号,请使用反斜杠。

      感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式来处理字符串中的转义引号:

/"[^"\\]*(?:\\.[^"\\]*)*"|[^,"]+/g

RegEx说明:

  • ":匹配文字开头报价
  • [^"\\]*:匹配任何不是\且不是引用的字符的0或更多
  • (?:\\.[^"\\]*)*:跟随转义字符和另一个非引号,非\。匹配此组合的0或更多以通过所有转义字符
  • ":匹配结束报价
  • |:或(更改)
  • [^,"]+:匹配非引号,非逗号字符串的1+

RegEx Demo



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);
}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用String#match并仅使用这些群组。

&#13;
&#13;
var array = ['RED,100', 'RED,"100"', 'RED,"100,"', 'RED,"100\"ABC\"200"'];

console.log(array.map(s => s.match(/^([^,]+),(.*)$/).slice(1)))
&#13;
&#13;
&#13;