【问题标题】:Regex match everything up until sequence of characters正则表达式匹配所有内容直到字符序列
【发布时间】:2017-09-02 23:02:36
【问题描述】:

我正在尝试提取部分 json 消息,但未能编写正确的正则表达式。

最大的问题是我正在为其编写的应用程序(Impala - 大数据查询引擎)包含一个使用 ? 阻止非贪婪操作的错误,因此我需要一个不同的解决方案。

例子

{"postcode":"ABCDEF","forename":"James","id":"{12}","surname":"Townsend"},
{"postcode":"HIJKLM","forename":"Toby","id":"{34}","surname":"Taylor"},
{"surname":"Reilly","postcode":"NOPQRS","forename":"Mike","id":"{56}"}

数据将采用这种格式,全部放在一个字符串中(无换行符),但在每个“部分”内,数据可以按任何顺序排列。

我需要使用正则表达式来结束消息中名字为“Toby”的部分

{"postcode":"HIJKLM","forename":"Toby","id":"{34}","surname":"Taylor"}

目前我有

{[^{]*"forename":"Toby"[^}]*}

但这不起作用,我需要它来匹配 {""} 作为开始和结束。

任何人都可以就如何做到这一点提供建议吗?

谢谢

【问题讨论】:

  • 闻起来像 X/Y 问题。这看起来(有点)格式良好的 json。根据所使用的语言(您不会告诉我们您是在例如 javascript 函数还是 C# 方法中进行正则表达式),加载和迭代 json 对象可能会更好,只需检查 forename 属性.
  • 我正在使用 Impala 查询引擎,它在 sql 语句中包含一个“regexp_extract”方法。语法是 regexp_extract(string initial, string pattern, string replacement) - 链接cloudera.com/documentation/enterprise/5-9-x/topics/…
  • 但是我目前正在使用这个网站来尝试让它最初工作regex101.com

标签: regex regex-lookarounds impala regex-greedy regex-group


【解决方案1】:

转义前/后大括号:

\{[^{]*"forename":"Toby"([^}]|\}(?="))*\}(?!")

live demo

【讨论】:

  • 感谢您的回复,不幸的是,该答案不包括我需要的一切。我需要示例中的整个中间语句。该现场演示有助于查看您想要的结果
  • @DataPro 我什至没有注意到失败。我已经改进了它,所以它通过了你的例子。现在它可能太脆弱了,因为它特别允许 } 后跟 " 作为内容,但它可能足以完成你的工作。
  • 一切看起来都很好,直到我在我的应用程序中使用它并收到以下错误:无法编译正则表达式模式:{[^{]*"forename":"Toby"([^}]|}(?="))*}(?!") 错误:无效的 perl 运算符:(?= 任何想法?我对特定的正则表达式语言了解不够
  • @DataPro 我可以看到问题。您没有准确地从我的答案中复制正则表达式。您省略了 } 之前的反斜杠,它位于“Toby”之后 8 个字符
  • 我准确地复制了您的声明,但他们没有显示的原因是在 Impala 中为了逃避您使用 // 而不是 /。我这样做了,错误显示为 Could not compile regexp pattern: \{[^{]*"forename":"Toby"([^}]|\}(?="))*\}(? !") 错误:无效的 perl 运算符:(?=
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 2011-09-15
  • 2020-03-16
  • 2014-01-10
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多