Javascript正则表达式-捕获前面有另一个字符串的字符串

Javascript正则表达式-捕获前面有另一个字符串的字符串,javascript,regex,regex-lookarounds,Javascript,Regex,Regex Lookarounds,我试图使用Javascript正则表达式从URL中提取一些变量值。URL采用以下模式: @companyname/dl分子式组件名称 示例URL为: @companyname/dl-atoms链接 我想使用一个正则表达式从URL中提取molecularType和componentName,以提供一个数组: [‘原子’、‘链接’] 以下是我使用brilliant网站所做的尝试: 正则表达式: /(@company\/dl+-)+(?!\1)/g 我的想法是,第一个捕获组将捕获@companynam

我试图使用Javascript正则表达式从URL中提取一些变量值。URL采用以下模式:

@companyname/dl分子式组件名称

示例URL为:


@companyname/dl-atoms链接

我想使用一个正则表达式从URL中提取molecularType和componentName,以提供一个数组:

<代码>[‘原子’、‘链接’]

以下是我使用brilliant网站所做的尝试:

正则表达式:

/(@company\/dl+-)+(?!\1)/g

我的想法是,第一个捕获组将捕获
@companyname/dl-
,第二个捕获组将捕获不在第一个组中的所有内容。然而,RegExr似乎暗示这将返回与第一个捕获组相同的结果。有人能帮忙吗


谢谢,您可以使用如下内容(请注意,我们了解结构,可以更好地微调正则表达式):

函数提取_字段(url)
{
var match=url.match(/@[^\/]+\/dl-([^-]+)-(\w+/);
如果(匹配){
返回{molecularType:match[1],componentName:match[2]};
}
返回false;
}
log(提取字段('@companyname/dl molecularType componentName');

log(提取_字段('@companyname/dl-atoms-link')您现在使用的是一个负前瞻
(?!\1)
。它的基本意思是“在第一个捕获组中,后面跟在我后面的不是”,但它没有捕获它

如果这两个变量始终是单词+数字,则可以使用
\w
(它等于
[a-zA-Z0-9.]
):

尝试:

let regex=/(@companyname\/dl-)(\w+)(\w+)/;
让测试用例=[
“@companyname/dl molecularType componentName”,
“@companyname/dl原子链接”
];
testCases.forEach(
str=>{
让match=str.match(regex);
log('整个匹配:',匹配[0]);
log('分子类型:',匹配[2]);
log('组件名称:',匹配[3]);
}

)
在正则表达式中,不必在捕获组
(@company\/dl+-)++
中捕获字符串的开头,也不必使用
+
重复它,因为它只出现一次。
(?!\1)
部分是一个消极的前瞻,是一个不使用任何字符的断言

获取值的另一个选项可以更精确地说明使用
[a-z]
允许匹配的内容,您可以扩展该选项使其匹配的范围超过a-z,并使用
/i
标志使匹配不区分大小写

在2个捕获组中捕获匹配项,并从结果中删除包含完整匹配项的第一个项目:

[
“@companyname/dl molecularType componentName”,
“@companyname/dl原子链接”
].forEach(s=>{
log(s.match(/@companyname\/dl-([a-z]+)-([a-z]+)/i.slice(1));

});
为什么是正则表达式而不是
.split(/[-]/).slice(-2)
您可能想尝试类似
@companyname\/dl-([^\/-]+)-([^\/-]+)
,或
@companyname\/dl-([^\/-]+)-([^\/-]+)$
的方法。请参阅。
“@companyname/dl atoms link”.split(“-”).slice(-2)
Hi@Wiktor Stribitzew。谢谢你的建议。然而,您的演示似乎只在PHP中工作。如果我在Javascript中尝试它,它只返回整个URL。它在任何地方都有效,您只需要获取捕获组中的值。请看,这似乎只是返回整个URL,而不是其部分的数组。很糟糕,请放弃
g
标志。要编辑我的答案让它变得简单吗