正则表达式,用于选择花括号内的双引号,而忽略外面的双引号

时间:2019-03-19 23:43:20

标签: regex regex-lookarounds regex-group

昨天我问了一个同样不够详细的问题。另外,所提供的建议看起来像解决了我的问题。但是有一些极端的情况。所以我在转贴。但是这次有更多细节。

这是字符串:

"2019/03/19","LegacyApp","{""Id"":""345-dg8"",{""Hello"",""This""},""Fake"":""Sym""}","","","(null)","",

我想匹配引号,如下所示。

To match

到目前为止,我得到的正则表达式是(?:[^{]+):(.*)$ 但它一直选择到最后。并分为两组。任何想法将不胜感激。

更新:现在,我可以选择花括号之间的部分。 {(?:\n|.)*}。不知何故需要匹配该选择中的双引号。

更新:可以,但是我不确定这个人的表现。

""(?=[a-zA-Z0-9])|""(?=})|""(?=:)|(?<=[a-zA-Z0-9])""

特别是因为此正则表达式将针对每摄取一百万条日志运行。

注意:我正在尝试在Elasticsearch中运行它。按照他们的说法,Lucene正则表达式引擎不兼容Perl,但支持较小范围的运算符。

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点。

我希望您使用每个语言中的正则表达式库提供的“偏移”。它可以让您知道匹配文本的位置。

首先,使用此正则表达式找出括号所在的位置。

{.+}

假设结果的偏移量是3到21。

然后,使用此简单的正则表达式。

""

结果的偏移量返回类似([5,6],[12,13] ...)的数组

最后,使用'for'子句在括号内选择双引号。

另一种方法是以下正则表达式。

(?<={|{[^}]|{[^}][^}]|{[^}][^}][^}]|{[^}][^}][^}][^}]|{[^}][^}][^}][^}]|{[^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}])""|""(?=[^{]*})

enter image description here