使用正则表达式拆分JSON字符串

时间:2016-03-07 19:26:22

标签: arrays json regex

我想使用正则表达式拆分JSON文档,其模式类似于[[[1,2],[3,4] [5,6]]]。这些对代表x ad y。我想做什么来取这个字符串并生成一个列表{" 1,2"," 3,4"," 5,6"}。最终我想拆分对。我想我可以列出{" 1,2",“3,4"," 5,6"}并使用for循环来分割对。这种方法是否正确分别得到x和y?

2 个答案:

答案 0 :(得分:1)

JSON不是常规语言,而是上下文无关语言,因此无法通过常规表达进行匹配。您需要一个完整的JSON解析器,就像您对问题的评论中引用的一样。

...但是,如果你要有一个固定的结构,比如只有三个级别的方块,并且你在问题中发布了结构,那么有一个可以解析的正则表达式 (它将是JSON语法的一个子集,不足以解析其他JSON内容):

您将拥有数字:([+-]?[0-9]+)

然后你会有括号和分隔符:\[\[\[,\],\[\]\]\]

最后,将所有这些放在一起:

\[\[\[([+-]?[0-9]+),([+-]?[0-9]+)\],\[([+-]?[0-9]+),([+-]?[0-9]+)\],\[([+-]?[0-9]+),([+-]?[0-9]+)\]\]\]

如果你想在符号之间允许空格,那么你需要:

\s*\[\s*\[\s*\[\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*\]\s*,\s*\[\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*\]\s*,\s*\[\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*\]\s*\]\s*\]\s*

这个regexp将有六个匹配的组,它们匹配匹配字符串中的相应整数作为folloging demo

澄清

常规语言,常规语法和正则表达式构成了一类具有许多实用属性的语言,例如:

  • 您可以使用所谓的有限自动机
  • 一次有效地解析它们
  • 您可以使用正则表达式定义自动机以接受语言句子。
  • 您可以简单地使用regexps(或使用自动机)来制作更复杂的接受器(用于语言集的联合,交集,对称差异,连接等),以便为它们创建接受器。
  • 您可以简单地说一个正则表达式(它定义的语言)是原始语言的子集,超集还是没有。

相比之下,它限制了可以用它定义的语言的力量:

  • 您无法定义允许嵌套子表达式的语言(例如您在JSON表达式中允许的包围或XML文档中允许的标记嵌套)
  • 您无法定义收集上下文的语言并在句子的其他位置使用它(例如,识别数字并且必须在句子的另一个地方匹配相同数字的句子)< / LI>

但是,我的答案的意思是,如果你绑定嵌套的上限(比方说,例如,三个级别的括号,如你发布的例子),你可以使你的语言规则,然后解析它用正则表达式。这样做并不容易,因为这通常会导致复杂的表达(正如你在我的回答中看到的那样)但并非不可能,并且你将有可能将句子的某些部分识别为常规子表达式的子匹配嵌入全球的。

如果要允许嵌套,则需要切换到上下文无关语言,这些语言是使用上下文无关语法定义的,并且接受更复杂的基于堆栈的自动机。然后,你失去了你所拥有的一整套操作:

  • 如果某种语言与另一种语言重叠(包括在内)
  • ,您将永远无法再说
  • 你永远不会再次通过联合,交集或其他无背景语言的差异来构建一种语言。

但是你可以匹配无界的嵌套句子。通常,编程语言是用定义的,带有无上下文语法和更多用于上下文检查的工作(例如,检查一些标识符是否在声明部分中实际定义,或者是否匹配起始和结束XML文档中匹配级别的标记标识符)

  • 有关无上下文的语言,请参阅this
  • 对于常规语言,请参阅this

第二次澄清

如你的问题你没有表达过想要匹配真实的十进制数,我修改了demo以使其允许固定点数(不是一般浮点数)使用指数表示法,你需要自己动手,作为练习)。只需进行一些测试并修改正则表达式以使其适应您的需求。

(好吧,如果你想看到解决方案,look at it

答案 1 :(得分:0)

是的,我尝试在我的代码中使用正则表达式,但它没有工作,所以我现在尝试不同的方法。我知道如何处理它,但它并没有真正起作用。首先让我更清楚这个问题。我试图解析JSON文档。如下图所示。该文件的字符串有[[[1,2],[3,4] [5,6]]]模式。我想要摆脱的是将每对作为列表。所以列表有一对x-y对。 the string structure

我的方法:首先在乞讨和结尾处替换“[[”和“]]”,所以我有一个相同模式的字符串。这给了[在这里输入图像描述] [2]我一个字符串“[1,2],[3,4] [5,6]”这是我的代码,但它不起作用。我如何解决它?另一件事我可能是一个问题,因为字符串的长度不一样。那么我该如何只替换开头和结尾呢?

my code

然后我可以使用正则表达式拆分方法来获取具有{“1,2”,“3,4”,“5,6”}形式的列表。我不确定如何做到这一点。

然后我取x和y,然后添加它们并将它们添加到列表中。所以我得到了一对列表对x-y对。如果你告诉我如何做这件事,我将不胜感激。

这是我正在研究的方法,但如果有更好的方法,我会很高兴看到它。 [在此处输入图像说明] [4]