正则表达式工作正常,直到回合括号发挥作用



在生产中,我遇到了一个令人讨厌的问题,我想出它与正则表达式有关:

正则表达式:

(?'Response'{s*("([w]+)"s*:s*"?((?'Message'[swd.\-/:;_']+(,[,swd.\-/:_]+)?)+)"s*,*s*)+})

正则表达式本身可以正常工作,并显示如下消息:

{ "ABC":[ { "Type":"K", "Message":"Any type of reasonable message 12345" } ]

如果我做这样的事情(例如添加圆括号),一切都会崩溃:

{ "ABC":[ { "Type":"K", "Message":"Any type of reasonable message 12345 (reasonable)" } ]

我尝试了很多途径,但我可以找到一种方法来"包含"(和)作为合法字符。

知道如何做到这一点吗?

谢谢

我的猜测是,如果我们没有其他锻炼选择,也许我们会将表达式简化为类似于:

({s*"([w]+)"s*:s*"[A-Z]+"s*,(s*"[w]+"s*:s*"[wds)(:;.']+"s*,?)+s*})

即使我不确定什么是可能的输入和所需的输出。

演示

正如评论所指出的,这里最好的办法是使用解析 JSON 的工具。这将使您能够更好地控制数据,因为它随时间变化。如果将其解析为 JSON 时出现问题,那么这可能是集中精力的更好地方。

我想指出的是,您似乎没有匹配文字[],因此您的匹配似乎可能与第一部分中的类似值匹配,您当前有"ABC",因此请注意清理数据。

有两种方法可以添加括号。您可以继续执行当前正在执行的操作,尝试考虑该字符串中可能允许的所有内容,因此您只需在遇到其他字符时添加它们。因此,此解决方案将起作用:

(?'Response'{s*("([w]+)"s*:s*"?((?'Message'[swd.\-/:;_'()]+(,[,swd.\-/:_]+)?)+)"s*,*s*)+})

在 https://regex101.com/r/xqP8BF/1 演示

但是,您可能会发现简单地排除您不想匹配的任何内容更容易,特别是"

(?'Response'{s*("([w]+)"s*:s*"?("(?'Message'[^"]*)")s*,*s*)+})

此处演示:https://regex101.com/r/pyaMaD/1

后面这个例子要简单得多。当然,完成后,清理数据。此外,根据您收到的数据,您可能需要考虑转义",但我相信即使使用其他正则表达式,您也需要这样做。

相关内容

最新更新