Javascript正则表达式-捕获以另一个字符串开头的字符串

时间:2019-01-22 18:16:30

标签: javascript regex regex-lookarounds

我正在尝试使用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似乎建议这将返回与第一个捕获组相同的结果。有人可以帮忙吗?

谢谢

3 个答案:

答案 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));
});