【问题标题】:Javascript: Regex for Parsing Google Sheets Data Containing CommasJavascript:用于解析包含逗号的 Google 表格数据的正则表达式
【发布时间】:2021-06-05 05:12:12
【问题描述】:

我有一个 JS 脚本,它从公共 Google 表格提要中提取数据,该提要以我需要解析的 JSON-CSV 格式返回数据。

行以逗号分隔,但每个项目中的逗号不会转义,例如:

"a: Feb 21, 10:11, b: some content, c: more, d: even more"

期望的结果:

{
  "a": "Feb 21, 10:11",
  "b": "some content",
  "c": "more",
  "d": "even more"
 }

拆分尝试

data.split(',') 返回:

{
  "a: Feb 21,
  "10:11",
  "b some content",
  "c: more",
  "d: even more"
 }

正则表达式尝试

以下正则表达式是我能得到的最接近的,但它仍然包含逗号,但我需要它将日期包装到属性下一次出现的开头: (?[^,]+): (?[^ ,]+)

Attempt image - Regex101

【问题讨论】:

    标签: javascript json regex csv google-sheets


    【解决方案1】:

    请参阅下面的编辑以获取新答案。


    声明的输出不是确定性的,逗号既可以是单元格的一部分,也可以是分隔符,没有办法知道它是哪一个。

    您可以将工作表发布为 .csv,而不是 JSON,如下所示:

    • 选择要发布的工作表,例如Sheet2
    • 选择格式Comma-separated values (.csv)

    之后,您可以通过 URL 访问 CSV 数据:

    https://docs.google.com/spreadsheets/d/e/<spreadsheet-id>/pub?gid=<tab-id>&single=true&output=csv
    

    示例表:

    | A1 cell   | B1 |
    | A2, stuff | B2 |
    

    返回的 CSV 内容示例:

    A1 cell,B1
    "A2, stuff",B2
    

    解析CSV的工具有很多,比如https://github.com/peterthoeny/parse-csv-js


    编辑,在得知 Esteban 无法更改数据源后:

    您可以使用 split 和 forEach 来构造所需的对象:

    const input = 'a: Feb 21, 10:11, b: some content, c: more, d: even more';
    let result = {};
    input.split(/, (?=[a-z]+:)/)
    .forEach(item => {
      let key = item.replace(/:.*/, '');
      let val = item.replace(/.*?: */, '');
      result[key] = val;
    });
    console.log(JSON.stringify(result, null, ' '));

    输出:

    {
     "a": "Feb 21, 10:11",
     "b": "some content",
     "c": "more",
     "d": "even more"
    }
    

    解释:

    • let result = {}; - 初始化并清空结果对象
    • .split(/, (?=[a-z]+:)/) - 使用 alpha: 键的正向前瞻在键/值对之间拆分
    • .forEach():
      • 从项目中提取键和值
      • 向结果对象添加新属性,属性名称为键

    【讨论】:

    • 我无法更改数据源,所以我必须通过 Javascript/jQuery 解析数据
    • @EstebanOrtega:请参阅更新答案中的编辑。
    【解决方案2】:

    这里有一个方法:

    (?<tag>\w+): (?<value>.+?)(?:,(?= \w+:)|$)
    

    Demo & explanation

    【讨论】:

    • 这太完美了,@Toto!我能够像这样在Javascript中实现它。欧元符号仍然存在问题,但这回答了我的问题。谢谢! imgur.com/EEz23BG
    【解决方案3】:

    假设帖子中的示例字符串在单元格 A2 中,试试这个:

    =SPLIT(REGEXREPLACE(" "&amp;A2,",\s([\w]+[\d]*:)","|$1"),"|")

    正则表达式的简单英文解释是这样的:“找到一个逗号,后跟一个空格,后跟一些单词类型的字符,后跟一个可能的单个数字,后跟一个逗号。如果找到,替换前导逗号和带管道符号的空格,其余部分保持原样。”

    SPLIT 作用于该管道符号。

    首先在整个字符串前面添加一个空格,以便为第一个标签找到“空格后跟逗号”。

    【讨论】:

    • 如何在我的脚本中应用这个正则表达式?我无法更改数据源,所以我必须通过 Javascript/jQuery 解析数据
    • 无法更改数据源是什么意思?您是否能够将原始数据从数据源复制并粘贴到另一个工作表?或者使用 IMPORTRANGE 将其放入另一张纸并在那里处理?您的帖子(也包括脚本的性质或上下文)不清楚您的情况参数。我认为我能提供的最好的是上面的 REGEX。这如何适合您的实际项目、脚本等的更大范围,我将不得不与您一起离开。或者,也许您可​​以提交另一篇包含更完整详细信息的帖子,其他人可以添加到我提供的内容中。
    • 我正在以编程方式提取(jquery fetch)恰好来自 Google 表格提要的数据。我只需要一个正则表达式来捕获日期的第二部分(包含逗号的文本):i.stack.imgur.com/h7fwX.png
    • 查看我新添加的帖子。
    【解决方案4】:

    试试这个:

    (?[^,\s]+): (?.+:\d\d|[^,]+)

    这里的关键是使用管道符号创建一个,它首先查找日期时间字符串的特定模式然后 em> 其他一切的模式(你开始使用的模式)。

    在您的 regex101 构建器中,它看起来像这样:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      相关资源
      最近更新 更多