在生产中,我遇到了一个令人讨厌的问题,我想出它与正则表达式有关:
正则表达式:
(?'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
后面这个例子要简单得多。当然,完成后,清理数据。此外,根据您收到的数据,您可能需要考虑转义"
,但我相信即使使用其他正则表达式,您也需要这样做。