【问题标题】:Simple Regex NOT on multidimensional JSON string简单的正则表达式不在多维 JSON 字符串上
【发布时间】:2015-05-04 02:19:29
【问题描述】:

所以我将提供这个简单的 json 字符串示例,涵盖了我的大部分实际字符串情况:

"time":1430702635,\"id\":\"45.33\",\"state\":2,"stamp":14.30702635,

我正在尝试对字符串中的数字进行预替换,将它们括在引号中,除了索引已经被引用的数字,就像在我的字符串中一样 - '\state\':2 到目前为止,我的正则表达式是

 preg_replace('/(?!(\\\"))(\:)([0-9\.]+)(\,)/', '$2"$3"$4',$string);

在这种情况下,我想要获得的 rezulting 字符串是“\state\”值未加引号,被正则表达式跳过,因为它包含 :digit 前面的 \",

"time":"1430702635",\"id\":\"45.33\",\"state\":2,"stamp":"14.30702635",

为什么 '\state\' 数字也被替换了?

也试过https://regex101.com/r/xI1zI4/1 ..

新编辑:

所以根据我的尝试,

  (?!\\")

不工作!!

如果我被允许,我会不回答这个问题,以防其他人知道原因。

我的解决方案是使用这个正则表达式,而不是 NOT,我选择了是 ..

$string2 = preg_replace('/(\w":)([0-9\.]+)(,)/', '$1"$2"$3',$string);

谢谢。

【问题讨论】:

  • 你不能先解码然后将所有元素转换为字符串,然后再重新编码
  • 不,因为我会丢失大整数stackoverflow.com/questions/8663298/…
  • 这是您当前情况的解决方案,但我认为这可以做得更好...preg_replace('~(("time":)([0-9.]+),|("stamp":)([0-9.]+),)~', '$2$4"$3$5",',$string);
  • @chris85 我的字符串只是一个例子,我的实际字符串大约有 100kb 长,不能用文字覆盖所有内容..我想我应该重新表述我的问题..
  • 所有应该有引号的数字是否一致?大于 5 位小数,以 143 开头等?

标签: php regex


【解决方案1】:

(?!\\") 是负前瞻,通常在正则表达式的开头没有用。在您的特定正则表达式中,它根本没有任何效果:表达式 (?!(\\\"))(\:) 表示“空字符串后不跟斜杠引号,然后是冒号”,这相当于仅尝试单独匹配冒号。

我认为你试图完成的是一个消极的后视,它在 PCRE 中的语法略有不同:(?<!\\")。进行此更改似乎符合您的要求:https://regex101.com/r/xI1zI4/2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2013-04-26
    • 1970-01-01
    • 2018-04-06
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多