regex 使多行正则表达式不贪婪(=懒惰)[重复]

vatpfxk5  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(123)

此问题在此处已有答案

Regular expression to stop at first match(9个答案)
17天前关闭。
我有这样一段代码:

{
  a: {
    b: 1,
    c: 2,
  },

  d: {
    e: 4,
    f: 5,
  },
}

字符串
我需要一个正则表达式分别匹配两个对象a和d。
第一场比赛:

a: {
  b: 1,
  c: 2,
},


第二场:

d: {
  e: 4,
  f: 5,
},


我试过这个:

.+: \{
([\s\S\r]+)
  \},


但它贪婪地将两个对象作为一个匹配项进行匹配。
如何使表达式变得懒惰?
我试着在几个地方放置懒惰的操作符?。但没有成功。
我在Visual Studio代码中使用文本搜索。

kpbpu008

kpbpu0081#

谢谢你,马尚费茨。你的回答让我想到了解决方案:

.+: \{
([\s\S\r]+?)
  \},

字符串
我在+之后的第二行添加了?。它在Visual Studio Code中运行。

nhjlsmyf

nhjlsmyf2#

在您提供的正则表达式中,与您的代码示例相比,似乎有一些不匹配的组件。在您的代码示例中,没有“catalog_ids”属性。让我们修改正则表达式以符合您的代码示例。
为了使正则表达式不贪婪(或懒惰),需要在正确的位置使用?字符。要捕获您提到的JavaScript对象,您应该将?字符放置在组中+的后面,如(.+?)。这意味着“匹配任何字符一次或多次,但尽可能少”。
下面是一个应该可以工作的正则表达式:

(\w+):\s+\{[\s\S]*?\},

字符串
说明:

  • (\w+)-匹配任何单词字符(等于[a-zA-Z0-9_]
  • :\s+\{-匹配:,然后匹配任何空白字符\s+,然后匹配{
  • [\s\S]*?-匹配任何字符(包括换行符),但由于?
  • \},-匹配},

请记住,正则表达式不一定是解析JSON等嵌套结构的最佳工具。根据您使用的语言,您可能需要考虑使用JSON解析器或类似工具。
当您使用VS Code时,如果您确保在搜索面板中选中了“使用正则表达式”和“大小写匹配”选项,则该正则表达式应该可以正常工作。还请记住,VS Code的搜索栏中的正则表达式不需要围绕/分隔符。

相关问题