登录
首页 >  Golang >  Go问答

问一个正则,求指点

来源:SegmentFault

时间:2023-01-25 11:38:26 374浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《问一个正则,求指点》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

apple,city=山东,color=猪皮红 number=100,year=2018 1529074637

怎么匹配这种格式的字符串

// 数据样例 myMeasurement,tag1=value1,tag2=value2 fieldKey=fieldValue 1556813561098000000

正确答案

摘要

如果要匹配这段字段串,大概会是这样一个正则表达式

const regex = /^\w+(?:,\w+=[\w\u4e00-\u9fa5]+)+\s\w+=\w+(?:,\w+=\w+)*\s\d+$/;

const s = "apple,city=山东,color=猪皮红 number=100,year=2018 1529074637";
console.log(regex.test(s));  // true
只考虑了 tag value 有中文的情况,如果 field value 也有可能出现中文,照样改写就行

正则表达式细节

规律其实题主已经总结出来了,由这几个部分组成

  1. myMeasurement
    ,就是第 1 个逗号之前的部分,需要匹配起始位
    ^
    ,所以是

    /^\w+/
  2. 接下来是逗号分隔的键值对,如果包含了

    myMeasurement
    之后的逗号,就很有规律,每一项是

    /,\w+=\w+/

    再考虑到值有中文,所以等号后面的

    \w+
    改成
    [\w\u4e00-\u9fa5]+
    ,结果

    /,\w+=[\w\u4e00-\u9fa5]+/

    这个项需要重复 n 次,所以把这个正则表达式用

    (?:  )
    括起来,缀
    +
    号表示重复

    /(?:,\w+=[\w\u4e00-\u9fa5]+)+/
  3. 接下来是一个空格,
    \s
    ,没啥好说的
  4. 接下来是另一组键值对,跟之前那组不同,这组没有起始的逗号,所以先加一个没逗号的

    /\w+=\w+/

    后面再接重复的带逗号的,考虑到只有一组的情况,所以后面的重复用

    *
    号,而不是
    +

    /(?:,\w+=\w+/)*
  5. 再接空格

    \s
    ,以及一组数字
    \d+
    ,并结束字符串
    $
    ,所以

    /\s\d+$/

把上面的各部分组合起来,就是需要的正则表达式

/^\w+(?:,\w+=[\w\u4e00-\u9fa5]+)+\s\w+=\w+(?:,\w+=\w+)*\s\d+$/

取值

使用上面的正则表达式可以判断字符串是否符合格式要求,但要取值会比较难。

如果需要取值,还是直接用代码来写比较好:

// 先按空格分成三段
const parts = s.split(" ");
// 第一段按逗号拆分之后,第一部分是 myMeasurement,后面是键值对列表
const [myMeasurement, ...tagList] = parts[0].split(",");

// 把列表中的键值对的键的值拆出来,变成 [键, 值] 这样
// 这里 tagPairs 是多个 [键, 值] 组成的列表(数组),
// 如果需要变成对象(表)直接用 Object.fromEntires(tagPairs) 就行
const tagPairs = tagList.map(t => t.split("=", 2));

// 第二组键值对,如法炮制
const fieldPairs = parts[1].split(",").map(t => t.split("=", 2));

// 按空格分成的第三部分就是那一串数字
const lastNumber = parts[2];

console.log("myMesurement: ", myMeasurement);
console.log("tags: ", tagPairs);
console.log("fields: ", fieldPairs);
console.log("last: ", lastNumber);

// myMesurement:  apple
// tags:  [ [ 'city', '山东' ], [ 'color', '猪皮红' ] ]
// fields:  [ [ 'number', '100' ], [ 'year', '2018' ] ]
// last:  1529074637

今天关于《问一个正则,求指点》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>