首页 > 解决方案 > 正则表达式:仅在特定行中匹配和替换空格

问题描述

我敢肯定,当我阅读答案时,我会把头撞到墙上,但我无法弄清楚这一点。

我有一个带有假数据的 JSON 来填充数据库。一个属性称为“slug”,包含一个我想“slugify”的字符串。

所以这:

[
  {
    blah: '[...]'
    slug: 'Plem ap at rem',
    bleh: '[...]',
  },
  {
    blah: '[...]'
    slug: 'Etiam vel augue',
    bleh: '[...]',
  },
]

应该变成:

[
  {
    blah: '[...]'
    slug: 'Plem-ap-at-rem',
    bleh: '[...]',
  },
  {
    blah: '[...]'
    slug: 'Etiam-vel-augue',
    bleh: '[...]',
  },
]

我想首先定位价值并绝望地只捕获空间:

slug: '(?:[\w]*([\s])*)+'

我在环顾四周有些混乱,但没有运气。

PS:我打算在 VSCode 的 find&replace 中使用它,但也欢迎知道我将如何在纯 JS中执行此操作!

标签: regexvisual-studio-code

解决方案


从 Visual Studio Code v.1.31.0 版本开始,您可以使用无限宽度的前瞻和后瞻,而不受任何约束。

您可以使用

查找内容:     (?<=slug: '[^']*)\s
替换为-

细节

  • (?<=slug: '[^']*)- 字符串中的位置,前面紧跟slug:、 空格'和 0+ 字符,而不是'
  • \s- 一个空格。

查看演示屏幕截图:

在此处输入图像描述

既然你问如何在 JavaScript 中做到这一点:

const text = `[\n      {\n        blah: '[...]'\n        slug: 'Plem ap at rem',\n        bleh: '[...]',\n      },\n      {\n        blah: '[...]'\n        slug: 'Etiam vel augue',\n        bleh: '[...]',\n      },\n    ]`;
console.log(text.replace(/(?<=slug: '[^']*)\s/gi, '-'))

或者,如果您使用的是 Safari 或任何其他不支持 ECMAScript 2018 标准的 JS 环境:

const text = `[\n      {\n        blah: '[...]'\n        slug: 'Plem ap at rem',\n        bleh: '[...]',\n      },\n      {\n        blah: '[...]'\n        slug: 'Etiam vel augue',\n        bleh: '[...]',\n      },\n    ]`;
console.log(text.replace(/(slug:\s*')([^']*)/gi, function(m,x,y) { 
  return x + y.replace(/\s+/g, '-');
}));


推荐阅读