多维JSON字符串上的简单正则表达式 NOT。

4

所以我将提供一个简单的JSON字符串示例,涵盖了我实际遇到的大多数字符串情况:

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

我正在尝试通过 preg_replace 将字符串中的数字用引号括起来,除了已经被引号括起来的数字,就像在我的字符串中 - '\state\':2 到目前为止,我的正则表达式是

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

在这种情况下,我希望获得的结果字符串是未引用的"\state\"值,被正则表达式跳过,因为它包含了:digit之前的\"。
"time":"1430702635",\"id\":\"45.33\",\"state\":2,"stamp":"14.30702635",

为什么 '\state\' 数字也被替换了?
也尝试在 https://regex101.com/r/xI1zI4/1 上进行了测试。
新的编辑:
所以根据我的尝试,
  (?!\\")

不能工作!!

如果允许我的话,我会不回答,以防有人知道原因。

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

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

谢谢。


你能否先对其进行解码,然后将所有元素转换为字符串,最后重新编码呢? - Kevin
不行,因为我会丢失大整数。 - ion
这里有一个解决方案适用于您当前的情况,但我认为这可以做得更好……preg_replace('~(("time":)([0-9.]+),|("stamp":)([0-9.]+),)~', '$2$4"$3$5",',$string); - chris85
@chris85 我的字符串只是一个例子,我的实际字符串长达100kb,无法用字面上的单词来涵盖所有内容..我想我应该重新表述我的问题.. - ion
所有需要加引号的数字是否有一些共同点?比如小数点后大于5位、以143开头等等? - chris85
@chris85 - 我的示例字符串涵盖了大多数情况,我想知道为什么 (?!\") 没有跳过 \state" .. - ion
1个回答

1

(?!\\")是负向前瞻,通常在正则表达式的开头并不实用。在你的正则表达式中,它没有任何效果:表达式(?!(\\\"))(\:)的意思是"空字符串后面不跟斜杠引号,然后是冒号",这等价于尝试仅匹配一个冒号。

我认为你想要实现的是负向后顾,它在PCRE中略有不同的语法:(?<!\\")。做出这个更改似乎可以实现你想要的匹配结果:https://regex101.com/r/xI1zI4/2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接