【问题标题】:Regex to find string between patterns not containing specific string正则表达式在不包含特定字符串的模式之间查找字符串
【发布时间】:2020-01-22 07:45:03
【问题描述】:

好的大师们, 假设我有以下字符串:

{
"event" : "party" ,
"Id" : "store" ,
"timestamp" : "2019-07-07T13:14:26.329Z" ,
"localDateTime" : "2019-07-07T16:14" ,
"orderStateUpdate" : {
"id" : "fj09bA9ywfGS" ,
"orderId" : "2315043" ,
"visitId" : "2315043" ,
"items" :{{
"id" : "fj09bA6K3K8u" ,
"quantity" : 1 ,
"stat" : "ok"
},
{
"id" : "fj09bA6K3K8u2" ,
"quantity" : 2 ,
"stat" : "ok"
}}
,
"items" :{{
"id" : "fj09bA6K3K8u" ,
"quantity" : 1 ,
"stat" : "junk"
},
{
"id" : "fj09bA6K3K8u2" ,
"quantity" : 2 ,
"stat" : "ok"
}}
,
"extraParams" : {"extraparamstuff1":"bugger"},"somethingelse" :"blahblahblah"
}}

字符串有两个(嵌套数组)用双花括号包裹。这个字符串特别包含一个错误,其中最后一个花括号也是双精度的;我试图用正则表达式捕获的是以 '}}' 开头的字符串,以 '}}' 结尾并且不包含 '{{' 像这样:

}}
,
"extraParams" : {"extraparamstuff1":"bugger"},"conversationLink" :"https://qa.app.package.ai/qa/#/app/dashboard?d=1561248000000&c=fdxkID9IifGv&p=fdxfaFgV1l1Y"
}}

我遇到了正则表达式的挑战,但我想出了这个:

(?:(\}\})).*(?:\{\{).*(?:\}\s*?\})

捕获

}}
,
"items" :{{
"id" : "fj09bA6K3K8u" ,
"quantity" : 1 ,
"itemState" : "LOADED"
},
{
"id" : "fj09bA6K3K8u2" ,
"quantity" : 2 ,
"itemState" : "LOADED2"
}}
,
"extraParams" : {"extraparamstuff1":"bugger"},"conversationLink" :"https://qa.app.package.ai/qa/#/app/dashboard?d=1561248000000&c=fdxkID9IifGv&p=fdxfaFgV1l1Y"
}}

这太过分了。有人可以帮助我了解如何找到这个吗?这是为了检查入站数据的错误(是的,我还需要检查额外的打开“{{”)。

【问题讨论】:

  • 只是一个想法,但这看起来很像 JSON。为什么不尝试解析 JSON,然后迭代以验证而不是在字符串上使用 RegEx? (是的,双卷曲是个问题,但也许你可以扫描并替换?)
  • @jakerella 它确实是 json。我们正在开展一个非常具体的项目来“扁平化”多维数据。我们不能使用传统的解析,因为我们在名称:值对中有重复的名称(并非所有代码都显示)等等。除了处理这种可能的情况(这将非常非常罕见......但可能),我们已经完成了所有其他事情。
  • 呃,明白了......好吧,我认为你可以做到这一点。如果没有人在我之前给出答案,我会稍微修改一下。
  • 您是否一直都知道您要捕获的这一位位于测试字符串的end?会不会和后面的其他属性放在中间?
  • @jakerella 不,这就是问题所在——我们不知道这个位置。 99% 的时间如果它发生它应该在字符串的末尾(一旦我们知道,我们可以很容易地 rtrim 或其他东西)......如果我们能找到关闭(或打开;必须同时做)双括号的模式在包含的字符串中重复没有打开(或关闭;反向)大括号,然后我们找到了有问题的对并可以删除它们。

标签: regex


【解决方案1】:

好的,所以,我认为您需要一个negative lookahead,因为您必须接受花括号,但不能接受双精度...这是我想出的,但不确定它是否适用于所有情况。

}}([^{]|{(?!{))+}}

它基本上是说:寻找两个结束的卷曲(}}),然后是任何非开始的卷曲字符([^{])或一个开始的卷曲字符(使用负前瞻)({(?!{)),重复根据需要多次(+),并以双结束卷曲结束(}}

实时(可更新)演示链接:https://regex101.com/r/kwlzco/2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多