一尘不染

正则表达式 .*? 不匹配一切

javascript

我正在尝试制作一个适用于以下字符串的正则表达式

  1. (?P<service>[a-z\-_]+)/(?<service2>[0-9]+)
  2. (?P<stylesheet>[\/\s%\w\.\(\)\[\]\@_\-]+)/variations

我首先为#1尝试了以下代码,它按预期工作

测试1:'(?P<service>[a-z\-_]+)/(?<service2>[0-9]+)'.replace(/\(.*?<(.*?)>.*?\)/g, '{$1}')

预期输出'{service}/{service2}'

结果输出:相同

但是,相同的模式不适用于#2。

测试 2:'(?P<stylesheet>[\/\s%\w\.\(\)\[\]\@_\-]+)/variations'.replace(/\(.*?<(.*?)>.*?\)/g, '{$1}')

预期输出{stylesheet}/variation

结果输出'{stylesheet}[]@_-]+)/variations'

它留下[]@_-]+)了一部分。

为什么.*?不匹配[]@_-]+)以及如何更改我的正则表达式以适用于两个字符串?


阅读 83

收藏
2022-07-26

共1个答案

一尘不染

您可以使用肯定的前瞻来断言 a/到右侧或字符串的末尾:(?=\/|$)

\(.*?<([^<>]*)>.*?\)(?=\/|$)

正则表达式演示

const regex = /\(.*?<([^<>]*)>.*?\)(?=\/|$)/gm;

[
  `(?P<service>[a-z\\-_]+)/(?<service2>[0-9]+)`,
  `(?P<stylesheet>[\\/\\s%\\w\\.\\(\\)\\[\\]\\@_\\-]+)/variations`
].forEach(s => 
  console.log(s.replace(regex, `{$1}`))
)
2022-07-26