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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式用于选择花括号内的双引号而忽略外部的引号相关的知识,希望对你有一定的参考价值。

我昨天问了一个问题,但问题还不够详细。此外,提供的建议看起来像解决我的问题。但是有边缘情况。所以我转发。但这次有更多细节。

这是字符串:

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

我想匹配下面突出显示的报价。

To match

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

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

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

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

特别是因为这个正则表达式将针对被摄取的百万个日志中的每一个运行。

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

答案

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

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

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

{.+}

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

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

""

结果的偏移返回一个数组,如([5,6],[12,13] ......)

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

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

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

enter image description here

以上是关于正则表达式用于选择花括号内的双引号而忽略外部的引号的主要内容,如果未能解决你的问题,请参考以下文章

Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]

GROOVY - 解析CSV:忽略双引号内的逗号

正则表达式匹配双引号内的每个字符串并包含转义引号

C#正则表达式用分隔符分割行,但忽略引号内的分隔符

如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)

Ansible 剧本 - 正则表达式 |无法更改括号和引号中的数据