【问题标题】:Regex for selecting the double quotes inside the curly braces while ignoring the ones outside用于选择花括号内的双引号而忽略外面的双引号的正则表达式
【发布时间】:2019-03-20 11:43:08
【问题描述】:

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

这是字符串:

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

我想匹配下面突出显示的引号。

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

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

更新:这行得通,但我不确定这家伙的表现。

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

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

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

【问题讨论】:

  • 嵌套是否限制为 1 级(根据您的示例)?如果没有,您将需要递归支持,而 ES 不支持 AFIAK。
  • 日志太多了。到目前为止,我会说让我们假设嵌套限制为 1。很抱歉无法给出明确的答案。

标签: regex regex-lookarounds regex-group


【解决方案1】:

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

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

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

{.+}

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

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

""

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

最后,用'for'子句挑出括号内的双引号。

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

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

【讨论】:

  • 你能看一下我添加到问题中的那个吗?有什么边缘情况吗?
  • ""(?=[^",])|""(?=})|""(?=:)|(?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多