我正在尝试使用Javascript正则表达式从URL中提取一些变量值。该网址采用以下格式:
@companyname/dl-molecularType-componentName
。
示例网址是:
@companyname/dl-atoms-link
我想使用一个RegEx从URL中提取MolecularType和componentName来给我一个数组:
['atoms', 'link']
这是我在出色的RegExr网站上尝试过的方法:
RegEx:
/(@company\/dl+-)+(?!\1)/g
我的想法是,第一个捕获组将捕获@companyname/dl-
,第二个捕获组将捕获第一组中没有的所有内容。但是RegExr似乎建议这将返回与第一个捕获组相同的结果。有人可以帮忙吗?
谢谢
答案 0 :(得分:1)
您可以使用如下所示的代码(请注意,我们知道结构并可以更好地微调正则表达式):
function extract_fields(url)
{
var match = url.match(/@[^\/]+\/dl-([^-]+)-(\w+)/);
if ( match ) {
return {molecularType: match[1], componentName: match[2]};
}
return false;
}
console.log(extract_fields('@companyname/dl-molecularType-componentName'));
console.log(extract_fields('@companyname/dl-atoms-link'));
答案 1 :(得分:0)
您当前使用的是超前的(?!\1)
。它的基本含义是“与我在第一个捕获组中的作用不同,没有跟随”,但它没有捕获它。
如果两个变量始终都是单词和数字,则可以使用\w
(等于[a-zA-Z0-9_]
):
尝试:
let regex = /(@companyname\/dl-)(\w+)-(\w+)/;
let testCases = [
"@companyname/dl-molecularType-componentName",
"@companyname/dl-atoms-link"
];
testCases.forEach(
str => {
let match = str.match(regex);
console.log('Whole match: ', match[0]);
console.log('Molecular Type: ', match[2]);
console.log('Component Name: ', match[3]);
}
)
答案 2 :(得分:0)
在正则表达式中,您不必在捕获组(@company\/dl+-)+
中捕获字符串的开头,也不必使用+
重复它,因为它只出现一次。 (?!\1)
部分是一个否定的超前行为,并且是一个不占用任何字符的断言。
获取值的另一种方法可能是更精确地说明您允许使用character class [a-z]
进行匹配的内容,您可以对其进行扩展以使其比z更匹配并使区分大小写不敏感使用/i
标志。
在2个捕获组中捕获您的匹配项,并从结果中删除包含完整匹配项的第一项:
[
"@companyname/dl-molecularType-componentName",
"@companyname/dl-atoms-link"
].forEach(s => {
console.log(s.match(/@companyname\/dl-([a-z]+)-([a-z]+)/i).slice(1));
});