【问题标题】:Regex: match and replace spaces only in particular lines正则表达式:仅在特定行中匹配和替换空格
【发布时间】:2018-10-07 09:10:28
【问题描述】:

当我阅读答案时,我确定我会用头撞墙,但我无法弄清楚这一点。

我有一个带有假数据的 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 中使用它,但也欢迎知道我将如何在 plain JS 中执行此操作!

【问题讨论】:

  • 在 VSC 中不可能,但 Notepad++ 或 Sublime Text 将是一个解决方案。喜欢这个(?:slug\W+|\G(?!^))\K(\w+) +。在此处查看现场演示regex101.com/r/VVBGhW/1
  • 在 js 中不工作是一种耻辱 :(
  • 在纯 JS 中这很容易,但不幸的是在 VSC 中没有办法。
  • @revo 那么在 js 里怎么样?

标签: regex visual-studio-code


【解决方案1】:

can use infinite-width lookahead and lookbehind 从 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, '-');
}));

【讨论】:

  • 了解这一点很有帮助。所以,在regex101,com,我们应该选择 JavaScript 来测试这些表达式。
【解决方案2】:

更新:VSCode 现在支持 Look behinds,请参阅 Wiktor 的回答和vscode/issues/68004


简单,但相当笨重的替代方案:

(slug: '\S*)\s 替换为:$1-

您必须多次单击“全部替换”按钮,直到匹配计数降至 0,因为它只匹配每行的第一个匹配项。我知道不理想,但如果你只做一次......

【讨论】:

  • 这个答案已经过时了,因为在 VSCode 中可以使用lookbehinds。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多