我正在尝试制作一个适用于以下字符串的正则表达式
(?P<service>[a-z\-_]+)/(?<service2>[0-9]+)
(?P<stylesheet>[\/\s%\w\.\(\)\[\]\@_\-]+)/variations
我首先为#1尝试了以下代码,它按预期工作
测试1:'(?P<service>[a-z\-_]+)/(?<service2>[0-9]+)'.replace(/\(.*?<(.*?)>.*?\)/g, '{$1}')
'(?P<service>[a-z\-_]+)/(?<service2>[0-9]+)'.replace(/\(.*?<(.*?)>.*?\)/g, '{$1}')
预期输出:'{service}/{service2}'
'{service}/{service2}'
结果输出:相同
但是,相同的模式不适用于#2。
测试 2:'(?P<stylesheet>[\/\s%\w\.\(\)\[\]\@_\-]+)/variations'.replace(/\(.*?<(.*?)>.*?\)/g, '{$1}')
'(?P<stylesheet>[\/\s%\w\.\(\)\[\]\@_\-]+)/variations'.replace(/\(.*?<(.*?)>.*?\)/g, '{$1}')
预期输出:{stylesheet}/variation
{stylesheet}/variation
结果输出:'{stylesheet}[]@_-]+)/variations'
'{stylesheet}[]@_-]+)/variations'
它留下[]@_-]+)了一部分。
[]@_-]+)
为什么.*?不匹配[]@_-]+)以及如何更改我的正则表达式以适用于两个字符串?
.*?
您可以使用肯定的前瞻来断言 a/到右侧或字符串的末尾:(?=\/|$)
/
(?=\/|$)
\(.*?<([^<>]*)>.*?\)(?=\/|$)
正则表达式演示
const regex = /\(.*?<([^<>]*)>.*?\)(?=\/|$)/gm; [ `(?P<service>[a-z\\-_]+)/(?<service2>[0-9]+)`, `(?P<stylesheet>[\\/\\s%\\w\\.\\(\\)\\[\\]\\@_\\-]+)/variations` ].forEach(s => console.log(s.replace(regex, `{$1}`)) )