V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
franklioxygen
V2EX  ›  问与答

regex 怎么找到所有 ‘起始标记’-‘变量’-‘终结标记’?

  •  
  •   franklioxygen · 2022-05-26 23:39:40 +08:00 · 893 次点击
    这是一个创建于 698 天前的主题,其中的信息可能已经有所发展或是发生改变。
    举个栗子,我有一个字符串

    “user”:{"id":"123", "username":"foo", "age":"18" },{"id":"124", "username":"bar", "age":"24" },...

    怎么找到所有的 从 username 到第一个逗号 "username":"...", ?
    第 1 条附言  ·  2022-05-27 10:43:31 +08:00
    let jsonObj = {
      data: {
        level1: {
          level2: {
            level3: {
              targetKey: 'targetValue'
            },
            targetKey: 'targetValue',
            level3ContentKey: 'level3value'
          },
          targetkey: 'targetValue',
          level2ContentKey: 'level2value'
        },
        targetKey: 'targetValue',
        level1contentKey: 'level1Value'
      }
    }
    
    function replaceValueInMultiLayerObject(mock, parents) {
      let helper = (jsonObject, parents) => {
        for (let [key, value] of Object.entries(jsonObject)) {
          if (key === 'targetKey') {
            let path = parents.reduce((all, item) => all + '.' + item, '').slice(1) + '.' + key;
            console.log('jsonObj.' + path);
          }
          if (typeof(value) === 'object') {
            parents.push(key);
            helper(value, parents);
            parents.pop()
          }
        }
      }
      let res = helper(mock, []);
    }
    replaceValueInMultiLayerObject(jsonObj);
    console.log(jsonObj);
    
    

    我是这么遍历path的, 拿到的path是string "jsonObj.data.level1.level2.level3.targetKey" "jsonObj.data.level1.level2.targetKey" "jsonObj.data.targetKey"

    6 条回复    2022-05-27 10:25:53 +08:00
    lmqdlr
        1
    lmqdlr  
       2022-05-27 00:43:14 +08:00 via Android
    非贪婪模式,全局匹配就好了呀。你是要用什么语言,这个示例的话,序列化成 JSON 更简单吧
    franklioxygen
        2
    franklioxygen  
    OP
       2022-05-27 01:09:46 +08:00
    @lmqdlr 我目标是从 json 里面替换掉一个特定 key 的每一个 value ,这个特定 key 可能在很多层里有。用的是 javascript 。之前写了个递归函数遍历所有节点生成了 path ,不过比较复杂,想着用 regex 可能省几行逻辑
    f0rger
        3
    f0rger  
       2022-05-27 08:54:24 +08:00 via iPhone
    @franklioxygen 你 mdn 搜一下 JSON.parse ,注意看第二个参数是个 function ,原生 API 就可以满足你的要求
    des
        4
    des  
       2022-05-27 09:14:15 +08:00 via iPhone
    你这算邪道路子,json 里面要多几个空格换行什么的,你这不就跑不通了
    我看你这举的例子,path 是固定的,那直接记录 path ,按 path 取不好吗?
    GuuJiang
        5
    GuuJiang  
       2022-05-27 09:38:53 +08:00 via iPhone
    用合适的工具去做合适的事,既然是 json 结构,就要用 json 的方式去处理,使用正则表达式属于歪门邪道,会有很多很多的特殊情况,比如 value 里面有个转义过的双引号怎么办,就算你不断地针对每一种特殊情况去打补丁,最后这个正则表达式也会变得复杂无比
    franklioxygen
        6
    franklioxygen  
    OP
       2022-05-27 10:25:53 +08:00
    @f0rger 这就学习一下,谢谢!
    @des path 不固定,这个 key 会在不同层级出现
    @GuuJiang 确实,如果有其他字符会产生问题。我目前的目标 value 是只有字母,如果要覆盖更多情况的话就不好写了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1838 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:26 · PVG 00:26 · LAX 09:26 · JFK 12:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.