【问题标题】:Javascript Regular expression not working as expectedJavascript 正则表达式未按预期工作
【发布时间】:2015-10-19 16:24:37
【问题描述】:

我有 JSON 格式的字符串,但不是有效的 JSON 字符串。字符串如下(它是单行字符串,但为了清楚起见,我添加了新行。)

"{
   clientId :\"abc\",
   note:\"ATTN:Please take care of item x\"
}"

我正在尝试使用 javascript 正则表达式修复它(重新格式化为有效的 JSON)。我目前正在使用以下正则表达式,但它不适用于第二个属性,即注意它的值中有冒号 (:)。

retObject.replace(/(['"])?([a-zA-Z0-9_]+)(['"])?:/g, '"$2": ');

我在这里要做的是使用正则表达式将上面的字符串重新格式化为

"{
   "clientId" :"abc",
   "note":"ATTN:Please take care of item x"
 }"

尝试了很多方法,但由于我还是 RegEx 的初学者,所以无法做到。

【问题讨论】:

  • 这可能是无效的,因为该“字符串”有多行,与 JavaScript 中的 that 不同。
  • 在 SO 上有很多类似的问题使用 RegEx..请看他们
  • 它的单行字符串。为了清楚起见,我添加了新行。对于那个很抱歉。我应该在帖子中提到它。
  • 如果这些答案对您有帮助,请接受其中一个。

标签: javascript json regex


【解决方案1】:

尝试使用.split()RegExp /[^\w\s\:]/.test()RegExp /\:$/.match()RegExp /\w+/

var str = "{clientId :\"abc\",note:\"ATTN:Please take care of item x\"}";
var res = {};
var arr = str.split(/[^\w\s\:]/).filter(Boolean);
for (var i = 0; i < arr.length; i++) {
  if ( /\:$/.test(arr[i]) ) {
    res[ arr[i].match(/\w+/) ] = arr[i + 1]
  }
}

console.log(res)

【讨论】:

  • 我很困惑像[^\w+\s+|\:] 这样的字符集里面有+| 是什么。你写的意思是“匹配除字母、加号、字母数字、竖线或冒号以外的任何字符”。这就是你想要的吗?
  • @torazaburo “这就是你想要的吗?”不;试图匹配{},;查看更新后的帖子。不过,如果这些字符在字符串中,则需要进一步调整。感谢字符集规则提醒
【解决方案2】:

尝试使用正则表达式修复损坏的 JSON 是徒劳的。就在您认为您的正则表达式正常工作时,您将看到额外的 gobbledygook,例如

"{ clientId :\"abc\", note:\"ATTN:Please take \"care\" of item x\" }"

其中一个字符串在其中包含双引号,现在您的正则表达式将失败。

为了您自己和您整个团队的理智,无论是现在还是未来,请修复产生此损坏 JSON 的上游组件。世界上所有的语言都有完美的 JSON 序列化器,可以创建符合标准的 JSON。告诉上游人使用它们。

如果您绝对别无选择,请使用备受诟病的 eval。以恶见恶:

eval('(' + json.replace(/\\"/g, '"') + ')')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多