【问题标题】:Using regex, extract values from a string in javascript使用正则表达式,从 javascript 中的字符串中提取值
【发布时间】:2018-01-18 23:36:57
【问题描述】:

需要使用正则表达式从字符串中提取值(出于性能原因)。 可能的情况如下:

  1. 红色,100
  2. 红色,“100”
  3. 红色,"100,"
  4. RED,"100\"ABC\"200"

生成的分隔 [label, value] 数组应为:

  1. ['RED','100']
  2. ['RED','100']
  3. ['RED','100,']
  4. ['RED','100"ABC"200']

我什至研究了解决方案和一个流行的库,只是拆分整个字符串来获取值, 例如'RED,100'.split(/,/) 可能就是这样做的。

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

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

感谢任何帮助。

【问题讨论】:

  • 是的,以case 3为例。如果我们用逗号分隔,它会分成3块对吗?我们不想要的
  • 逗号可以在第一部分(红色)吗?
  • 是的,第一部分也是如此,即标签也是如此。
  • 从用户的角度来看,它的输入很简单。格式是 label,value 但是如果你想在标签/值中输入逗号(,)或引号(“),我们不会对此进行拆分,

标签: javascript regex string


【解决方案1】:

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

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

正则表达式解释:

  • ":匹配文字开头的引号
  • [^"\\]*:匹配 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);
}

【讨论】:

  • 非常感谢。这难以置信。花了将近10分钟才过去。再次感谢。你刚刚启发了我关于正则表达式的力量。
【解决方案2】:

您可以使用String#match 并只选择组。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多