【问题标题】:JS RegEx that matches commas within quotes匹配引号内逗号的 JS RegEx
【发布时间】:2018-06-25 12:46:36
【问题描述】:

我正在尝试获取基于文本的日志文件,如下所示:

type: 'click', category: 'REFRESH_DOOR', desc: '点击刷新 门 0124',站点:'mysite',路径名:'/load_areas/all/doors',参数: '?sort_by=code&layout=view_by_4',时间:'1515838628166',手机: '假',bp:'xlarge',大小:'[1920, 935]',区域:'全部',sid: '15158225889',设施:'MMMM',IP 地址:'XXX.XXX.XXX.XXX', 创建时间:'2018 年 1 月 13 日 04:17'

并遍历它以从中构建一个 JSON 对象。当我在上面的条目上log.split(",") 以从字符串的各个部分中创建单独的对象时,它会获取日期并将其拆分,从而破坏数据。

什么是在单引号中查找逗号的正则表达式,我可以在尝试将此字符串拆分为 JS 数组之前替换它?

我基本上想改:'January 13, 2018 04:17' to 'January 13; 2018 04:17',稍后再担心转换。

我试过这样的表达方式:

'([^']*)'

在引号之间取所有内容,但我无法仅针对引号之间的逗号。

【问题讨论】:

    标签: javascript json node.js regex


    【解决方案1】:

    您可以先将有问题的逗号替换为某个独特的名称,然后再以此分割。最后,我们遍历各个部分并实际构建我们的对象:

    var subject = "type: 'click', category: 'REFRESH_DOOR', desc: 'clicked refresh from door 0124', site: 'mysite', pathname: '/load_areas/all/doors', params: '?sort_by=code&layout=view_by_4', time: '1515838628166', mobile: 'false', bp: 'xlarge', size: '[1920, 935]', area: 'all', sid: '15158225889', facility: 'MMMM', IP Address: 'XXX.XXX.XXX.XXX', created: 'January 13, 2018 04:17'";
    
    var regex = /'[^']+'|(,)/g;
    var kv = /(\w+):\s*'([^']+)'/;
    
    replaced = subject.replace(regex, function(m, group1) {
        if (typeof group1 == 'undefined') return m;
        else return 'SUPERMAN';
    });
    
    // create an object that holds our values
    var jsonObject = {};
    
    // create a function that splits the individual items
    function splitter(item) {
    	var match = kv.exec(item);
      jsonObject[match[1]] = match[2];
    }
    
    parts = replaced.split("SUPERMAN");
    parts.forEach(splitter);
    console.log(jsonObject);

    产生:
    {
      "type": "click",
      "category": "REFRESH_DOOR",
      "desc": "clicked refresh from door 0124",
      "site": "mysite",
      "pathname": "/load_areas/all/doors",
      "params": "?sort_by=code&layout=view_by_4",
      "time": "1515838628166",
      "mobile": "false",
      "bp": "xlarge",
      "size": "[1920, 935]",
      "area": "all",
      "sid": "15158225889",
      "facility": "MMMM",
      "Address": "XXX.XXX.XXX.XXX",
      "created": "January 13, 2018 04:17"
    }
    


    改编自The Best Regex Trick

    【讨论】:

    • @ChrisWest:如果它对您有用,那么您可能想要接受和/或投票赞成答案(左侧的绿色勾号)。
    【解决方案2】:

    我将正则表达式稍微更改为/'.*?'/g,以便它选择引号内的任何内容,然后我们只需对其进行替换以查找所有逗号并用分号替换它们。

    var str = "type: 'click', category: 'REFRESH_DOOR', desc: 'clicked refresh from door 0124', site: 'mysite', pathname: '/load_areas/all/doors', params: '?sort_by=code&layout=view_by_4', time: '1515838628166', mobile: 'false', bp: 'xlarge', size: '[1920, 935]', area: 'all', sid: '15158225889', facility: 'MMMM', IP Address: 'XXX.XXX.XXX.XXX', created: 'January 13, 2018 04:17'";
    
    //Select all quoted strings...
    var replacedCommas = str.replace(/'.*?'/g, function(match){
      //Now replace any commas found in each match with semicolons
      return match.replace(/,/g, ';');
    });
    
    console.log(replacedCommas);

    【讨论】:

    • 为什么需要?。你就不能'.*'吗?
    • ? 使它不那么贪婪。没有它,它将尝试匹配尽可能多的字符,因为. 匹配每个字符。正则表达式 '.*' 很可能匹配第一个引号,然后是整个字符串中该引号和最后一个引号之间的所有内容,因为该引号也匹配 .* 模式。添加?使之前的模式(.*)匹配尽可能少的字符。这意味着它将匹配一个引号,然后匹配其他任何内容,直到遇到另一个引号。基本上,它保证它会停止并且 next 引用而不是 last 引用。
    • 哦,有趣。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2014-05-02
    • 1970-01-01
    • 2015-05-30
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多