【问题标题】:Regex for matching arrays of values or another arrays用于匹配值数组或其他数组的正则表达式
【发布时间】:2021-11-15 17:02:03
【问题描述】:

我正在尝试创建一个正则表达式,它将捕获其中的任何对象的整个数组。

我有示例输入字符串:

[2020-05-29T10:00:00, 12.5, 'Test text'][][[], ['Some Data']][['String with[ \'escaped quote][ and parenthesis inside it']]

预期的匹配是:

Match 1: [2020-05-29T10:00:00, 12.5, 'Test text']
Match 2: []
Match 3: [[], ['Some Data']]
Match 4: [['String with[ \'escaped quote][ and parenthesis inside it']] // If this one is possible it's brilliant

我已经创建的正则表达式是:\[[a-zA-Z0-9\-,' :\.\[]*\],但它不处理数组数组和字符串内的括号。

非常感谢您的帮助!

【问题讨论】:

  • 这里不能有[[], []]匹配。
  • 如果您使用 PCRE,可以使用 \[\s*(?>((?:'[^\\']*(?:\\[\s\S][^\\']*)*'|[^]'\s,])+)(?:\s*,\s*\g<1>)*|(?R))*\s*],但它可能不适用于所有情况。 \[\s*(?>(\w+(?:\.\w+)*(?:\[\w+])*|(?:'[^\\']*(?:\\[\s\S][^\\']*)*'|[^]\w])+)(?:\s*,\s*\g<1>)*|(?R))*\s*] 可能...但这太脆弱了,您需要获取适当的解析器。
  • 我有一些东西可以匹配你的 4 场比赛,但我真的需要先了解引擎才能发布它。如果你可以添加一个语言标签会很有帮助,因为正则表达式标签要求“这个标签还应该包括一个指定适用的编程语言或工具的标签”。
  • @Scratte 添加了一个平台,它是 .net C#
  • 你不能用正则表达式解析这些,原因在这个答案中有详细解释(对于用正则表达式解析 HTML 的等效问题):stackoverflow.com/a/1732454

标签: c# .net regex


【解决方案1】:

这类似于问题Regex nested parentheses - 您应该查看已接受的答案以获得对正在发生的事情的一个很好的解释。

我相信你想要的正则表达式是:

\[(?>'(?:[^'\\]|\\.)*'|\[(?<DEPTH>)|\](?<-DEPTH>)|'(?:[^'\\]|\\.)*'|[^\[\]]+)*\](?(DEPTH)(?!))

【讨论】:

  • 您为什么认为这是一个与 .NET 相关的问题?此外,它不适用于 [] 未在 '...' 字符串文字内配对的情况。在这里仅检查 DEPTH 组堆栈中开/关括号的顺序和数量不是解决方案。
  • 关于 [] 在 Wiktor 字符串中的问题的公平点。我针对提供的示例进行了测试(确实有效)。 .Net - 这是我所熟悉的。这个问题没有表达一个特定的平台——应该把我的网撒得更广!我将更新“答案”以指出您提出的非常公平的问题。 :-)
  • @Brett 很抱歉在标签中缺少平台。它正是 .net (C#)。这个正则表达式几乎是完美的,它非常匹配,但是不匹配:[['String with[ ][ parenthesis inside it']] 在这种情况下,第一个括号被忽略。差不多了
  • 我认为在考虑使用[] 作为深度之前,我们需要使用单引号(字符串)中的任何内容。我已经测试了以下似乎可行的方法,假设字符串中的单引号通过重复进行转义(例如'a string''s length')。给你:\[(?&gt;'.*?'|\[(?&lt;DEPTH&gt;)|\](?&lt;-DEPTH&gt;)|'.*?'|[^\[\]]+)*\](?(DEPTH)(?!))
  • @Brett Brilliant。我试图通过使用\' 转义字符串内部的' 来使其工作,这更自然。是否可以包括最后一项调整?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2021-10-13
  • 2022-12-03
  • 2016-09-24
  • 2011-08-26
  • 2014-02-06
相关资源
最近更新 更多