你知道用JavaScript解析这个字符串吗?

你知道用JavaScript解析这个字符串吗?,javascript,regex,Javascript,Regex,更新: 谢谢你的帮助。实际上,我使用了CSV解析器来获得我想要的东西,但我问这个问题只是因为我想知道CSV解析器的内部部分是如何工作的 这是谷歌分析CSV报告的一部分。事实上,我已经找到了许多其他的lib来检索我想要的内容,但我真的想知道从这个特定案例中获取我想要的数据的最佳方式是什么。虽然一开始看起来没那么难,但这让我抓狂 数据看起来像一个字符串: /page1/index.php,"795,852","620,499",00:03:25,"33,416",10.82%,66.43%,$0.

更新:

谢谢你的帮助。实际上,我使用了CSV解析器来获得我想要的东西,但我问这个问题只是因为我想知道CSV解析器的内部部分是如何工作的


这是谷歌分析CSV报告的一部分。事实上,我已经找到了许多其他的lib来检索我想要的内容,但我真的想知道从这个特定案例中获取我想要的数据的最佳方式是什么。虽然一开始看起来没那么难,但这让我抓狂

数据看起来像一个字符串:

/page1/index.php,"795,852","620,499",00:03:25,"33,416",10.82%,66.43%,$0.00
字符串
/page1/index.php
是一个页面的名称。 第一个数字是页面视图 第二个数字“620499”是唯一的页面视图 然后是平均持续时间

然后我想将其解析为一个对象,如下所示:

{
  page: "/page1/index.php"
  pv: 795852
  uv: 620499
  avg_time:"00:03:25"
}
出于某些原因,我只需要保留这个字符串中的前四个数据。当我尝试使用一个简单的JavaScript代码进行解析时,一切都很正常,直到在“页面视图”数据很小的情况下我发现了一些不同的东西

例如,有时它看起来像:

/page2/index.php,"795,852",620,00:03:25,"33,416",10.82%,66.43%,$0.00
或:

或:

规则是:当数字大于1000时,写为

"795,852"
但是当这个数字变小的时候,它只是

852
它没有
,当然也没有
作为拆分器。这使得仅使用正则表达式获取数据变得非常困难

这使得将字符串解析为所需对象非常困难,例如:

{
  page: "/page1/index.php"
  pv: 795852
  uv: 620499
  avg_time:"00:03:25"
}

用JavaScript解析这个问题有什么好主意吗?

使用csv解析器,而不是正则表达式。试着这样做:


Regex不是解析CSV的合适工具。

尝试一些CSV解析器,如

一般来说,我同意反对使用正则表达式解决此类问题的观点,而且使用合适的解析器可能更容易;然而,在这种情况下,我认为正则表达式可以工作:

^([^,]+),(("[^"]+")|([^,]+)),(("[^"]+")|([^,]+)),([^,]+),
即:

  • 第一个字段是直到第一个逗号的所有内容
  • 如果下一个字段以一个
    ”开头,则将所有内容更新到下一个
    ;否则,请将所有内容添加到下一个逗号
  • 下一个字段同上
  • 最后一个字段是直到下一个逗号的所有内容
    • 那么:

      var data = [
        '/page1/index.php,"795,852","620,499",00:03:25,"33,416",10.82%,66.43%,$0.00',
        '/page2/index.php,"795,852",620,00:03:25,"33,416",10.82%,66.43%,$0.00',
        '/page3/index.php,852,"620,499",00:03:25,"33,416",10.82%,66.43%,$0.00',
        '/page4/index.php,852,620,00:03:25,"33,416",10.82%,66.43%,$0.00'
      ];
      
      data.map(function (item) {
        return item.replace(/"(\d+),(\d+)"/g, '$1$2');
      }).map(function (item) {
        var a = item.split(',');
        return {
          page: a[0],
          pv: parseInt(a[1]),
          uv: parseInt(a[2]),
          avg_time: a[3]
        };
      });
      
      其结果是:

      [
        {
          "page": "/page1/index.php",
          "pv": 795852,
          "uv": 620499,
          "avg_time": "00:03:25"
        },
        {
          "page": "/page2/index.php",
          "pv": 795852,
          "uv": 620,
          "avg_time": "00:03:25"
        },
        {
          "page": "/page3/index.php",
          "pv": 852,
          "uv": 620499,
          "avg_time": "00:03:25"
        },
        {
          "page": "/page4/index.php",
          "pv": 852,
          "uv": 620,
          "avg_time": "00:03:25"
        }
      ]
      
      这有什么问题吗?

      • 它易碎
      • 替换数字中的
        的正则表达式很弱
      但是…

      • 它似乎起作用了
      @awqituigou:由于嵌套分组,您需要提取元素1、2、5和8。@awqituigou:很好的尝试;您的输入不完整。关于您的“更新”,csv解析器也不会使用正则表达式。它实际上将根据标准解析csv,这意味着逐个字符弹出,确定给定当前上下文中每个字符的含义,并基于此创建有意义的数据。这通常使用有限状态机实现。
      var data = [
        '/page1/index.php,"795,852","620,499",00:03:25,"33,416",10.82%,66.43%,$0.00',
        '/page2/index.php,"795,852",620,00:03:25,"33,416",10.82%,66.43%,$0.00',
        '/page3/index.php,852,"620,499",00:03:25,"33,416",10.82%,66.43%,$0.00',
        '/page4/index.php,852,620,00:03:25,"33,416",10.82%,66.43%,$0.00'
      ];
      
      data.map(function (item) {
        return item.replace(/"(\d+),(\d+)"/g, '$1$2');
      }).map(function (item) {
        var a = item.split(',');
        return {
          page: a[0],
          pv: parseInt(a[1]),
          uv: parseInt(a[2]),
          avg_time: a[3]
        };
      });
      
      [
        {
          "page": "/page1/index.php",
          "pv": 795852,
          "uv": 620499,
          "avg_time": "00:03:25"
        },
        {
          "page": "/page2/index.php",
          "pv": 795852,
          "uv": 620,
          "avg_time": "00:03:25"
        },
        {
          "page": "/page3/index.php",
          "pv": 852,
          "uv": 620499,
          "avg_time": "00:03:25"
        },
        {
          "page": "/page4/index.php",
          "pv": 852,
          "uv": 620,
          "avg_time": "00:03:25"
        }
      ]