【问题标题】:REGEXP to find the first occurrence of a string not followed by another stringREGEXP 查找第一次出现的字符串没有后跟另一个字符串
【发布时间】:2017-12-25 00:07:38
【问题描述】:

我有几页 JSON 要像这样搜索:

"company": "chocolate factory"
"position": "founder"
"company": "chocolate packagers"
"position": "packager"
"company": "chocolate shop"
"position": "clerk"

我只想在第一次出现的“位置”后面没有创建者的情况下进行匹配。前面的例子不匹配,但下面的例子会匹配。

"company": "chocolate factory"
"position": "taster"
"company": "chocolate packagers"
"position": "founder"
"company": "chocolate shop"
"position": "clerk"

这看起来将匹配“位置”的第一次出现

("position": ")?

我认为这应该匹配第一次出现的“职位”,前提是它后面没有“创始人”

("position": ")?(?![^"]*founder)

我已经在 regexr.com 上尝试过,但它似乎无法正常工作。

这样做的正确方法是什么?

编辑:为了澄清,我只能在网络应用程序上使用搜索框。我猜它是一个 javascript 正则表达式,但我无法确定使用了哪些标志(这让事情变得很困难)......但我认为如果有意义的话,它是一个 SQL 数据库进行正则表达式搜索。

我只想匹配第一次出现的“位置”

(?:"position": ")?

但前提是后面没有“创始人”

(?:"position": ")?(?![^"]*founder)

(?:"position": "(?![^"]*founder))?

这种似乎适用于测试网站,但似乎不适用于网络应用程序。由于我不了解后端,因此我可能不会弄清楚这一点。

编辑:我发现了问题。这是 postgresql 正则表达式 - 转义略有不同,看起来它的搜索方式也有点不同。基本上,我不认为我想要的会起作用。

【问题讨论】:

  • 您可以使用正则表达式,但我怀疑更好的方法是使用实​​际的 JSON 解析器。
  • 试试^((?!"position")[\s\S])*"position"(?![:\s]*"founder") 之类的(不确定是否理解正确)
  • 不太清楚你想做什么。听起来像是经典的XY problem。我同意@Phylogenesis,听起来你实际上需要一个带有简单条件的JSON解析器。除非您的示例 JSON 确实是您所拥有的,在这种情况下您没有 JSON,否则您会有一系列用冒号分隔的字符串。

标签: regex regex-negation regex-lookarounds


【解决方案1】:

这应该符合您的要求。

^("(?!position).+?": ".+?"\n)+"position": "(?!founder)

【讨论】:

  • 这将匹配“位置”的每个实例,而不是“创始人”。我试图只匹配位置的第一个实例,并且只有在它没有被创始人跟随的情况下。我真的很想知道他现在是不是创始人……我不在乎他是不是以前的工作。
  • 我将其更改为仅捕获字符串中的第一个位置。我假设每个 JSON 都是一个单独的字符串,否则您没有包含足够的示例数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2013-12-18
  • 2019-10-23
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多