【问题标题】:Unable to change/fetch the JSON value using REGEX and it returned Undefined无法使用 REGEX 更改/获取 JSON 值,它返回 Undefined
【发布时间】:2021-09-03 08:28:18
【问题描述】:

我正在尝试从 JSON 文件中获取货币的价值,如果是美元,那么我需要将其更改为澳元。

当我尝试在 json 文件中搜索货币属性时,返回 undefined 如下:

代码:

var datastring = JSON.stringify(data);
var match = /"currency":(^")*/.exec(datastring);
console.log(match ? "Got " + match[1] : "No match");

输出: 未定义

data.json:

{
   "bank":[
      {
         "bankAccountType":"Saving",
         "country":"US",
         "currency":"USD",
         "firstName":"TestFirstName",
         "lastName":"TestLastName",
         "confirmed":"true"
      }
   ]
}

有人可以帮我如何更新 JSON 文件中的货币值以及为什么它返回“未定义”

提前致谢。

更新:

data.json 是动态的 json 文件,每隔几分钟结构会有所不同。我只感兴趣从 data.json 文件中获取始终可用的货币属性,并在将其调用到服务器之前更新 json。

【问题讨论】:

  • 当你可以直接使用data.bank.currency获取数据时为什么要字符串化
  • 显示的代码是否代表实际应用程序?获取结构化数据,将其转换为字符串,然后尝试对其进行模式匹配,这看起来相当奇怪,因为您可以更轻松地直接操作数据。即使您给了一个 JSON 字符串,将其解析为一个对象并处理该结果也可能是一种更简洁的方法。

标签: javascript json regex


【解决方案1】:

正则表达式错误。试试/"currency":"([^"]*)"/

【讨论】:

    【解决方案2】:

    一般来说,对 JSON 这样的结构化数据进行这样的字符串匹配可能会导致比它解决的问题更多的问题:如果数据始终具有相似的结构,您可以基于该结构更干净地操作它;如果它的结构并不总是相似,则无法保证字符串操作将始终按照您的意愿进行。

    尽管如此,您的正则表达式很简单,但包含几个错误:

    /"currency":(^")*/
    
    • "currency": 将按字面意思匹配;到目前为止,一切都很好(只要 JSON 文件中没有多余的空格)
    • (:启动捕获组
    • ^:匹配字符串的开头;这不可能在这里成功
    • ":匹配文字 "
    • )*:结束捕获组,说它可以发生0次或多次

    您可能指的是[^"],而不是(^"),这意味着“除" 之外的任何单个字符”。但这仍然行不通,因为: 之后的字符 ",所以你需要先匹配它。

    你可能想要+,而不是*,意思是“一个或多个”;或者只是{3},表示“正好三个”。

    最后,您要捕获整个 3 个字符的货币,而不仅仅是它的第一部分,所以括号需要围绕整个事物。

    把它放在一起:

    /"currency":"([^"]+)"/
    

    或者:

    /"currency":"([^"]{3})"/
    

    或者,您可以更简单,使用三个“任意单个字符”通配符:

    /"currency":"(...)"/
    

    【讨论】:

    • 非常有用的信息。我肯定会看看这个..!!
    【解决方案3】:

    这里有一个如何做到这一点的例子。

    let data = {
       "bank":[
          {
             "bankAccountType":"Saving",
             "country":"US",
             "currency":"USD",
             "firstName":"TestFirstName",
             "lastName":"TestLastName",
             "confirmed":"true"
          }
       ]
    };
    
    var datastring = JSON.stringify(data);
    
    console.log(datastring);
    
    var match = /"currency":\"[A-Z]{3}\"/.exec(datastring)[0];
    
    let currencyVal = match.split(":")[1].replaceAll('"', '');
    
    console.log(currencyVal);
    
    //Too can do directly from data
    
    console.log(data.bank[0].currency);
    
    //If the data is a string you can use JSON.parse() function for get a JSON object.
    
    //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
    
    //Supposing you get the JSON with type string:
    
    let jsonObj = JSON.parse(datastring);
    
    console.log(jsonObj.bank[0].currency);
    
    //If you want replace USD to AUD you can do for example:
    
    jsonObj.bank[0].currency = jsonObj.bank[0].currency.replace("USD", "AUD");
    
    console.log(jsonObj.bank[0].currency);

    【讨论】:

      【解决方案4】:

      您可以使用以下正则表达式从USD 更改为AUD

      /(?<="currency":")[^"]+/
      

      const data = {
        bank: [{
          bankAccountType: "Saving",
          country: "US",
          currency: "USD",
          firstName: "TestFirstName",
          lastName: "TestLastName",
          confirmed: "true",
        }, ],
      };
      
      var datastring = JSON.stringify(data);
      const replacedString = datastring.replace(/(?<="currency":")[^"]+/, "AUD");
      console.log(replacedString);

      【讨论】:

      • 是否可以将任何货币类型更改为澳元。现在的例子有美元,但它可能是英镑、加元或日元。无论 JSON 文件中的当前货币类型如何,如何将其设为 AUD。请对此有任何意见?
      • 您确定需要(?=USD) 部分吗? USD 自己不会做同样的事情吗?
      • @ArrchanaMohan 我已将正则表达式更改为(?&lt;="currency":")[^"]+ 然后无论货币是什么,它都会替换为AUD
      • 非常感谢您的帮助..!真的很感激......!
      【解决方案5】:

      const data = {
        bank: [
          {
            bankAccountType: 'Saving',
            country: 'US',
            currency: 'USD',
            firstName: 'TestFirstName',
            lastName: 'TestLastName',
            confirmed: 'true'
          }
        ]
      }
      const datastring = JSON.stringify(data)
      const replace = datastring.replace(/"currency":"([^"]*)"/, '"currency":"AUD"')
      const reparsed = JSON.parse(replace)
      console.log(reparsed)

      【讨论】:

        猜你喜欢
        • 2021-11-04
        • 2020-11-27
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多