Регулярные выражения Javascript - захват строк, которым предшествует другая строка - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь использовать регулярные выражения Javascript для извлечения некоторых значений переменных из URL. URL принимает следующий шаблон:

@companyname/dl-molecularType-componentName.

Пример URL:

@companyname/dl-atoms-link

Я хотел бы использовать один RegEx для извлечения молекулярного типа и componentName из URL, чтобы получить массив:

['atoms', 'link']

Вот что я попробовал, используя блестящий RegExr сайт:

RegEx:

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

Моя идея в том, что первая группа захвата будет захватывать @companyname/dl-, а вторая - все, что не входит в первую группу. Однако RegExr, похоже, предполагает, что это вернет те же результаты, что и первая группа захвата. Кто-нибудь может помочь?

Спасибо

Ответы [ 3 ]

0 голосов
/ 22 января 2019

То, что вы используете прямо сейчас, является негативным взглядом (?!\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]);
  }
)
0 голосов
/ 23 января 2019

В вашем регулярном выражении вам не нужно фиксировать начало строки в группе захвата (@company\/dl+-)+, и вам не нужно повторять ее, используя +, потому что это происходит только один раз.Часть (?!\1) является негативным взглядом и является утверждением, которое не использует никаких символов.

Другой вариант получения ваших значений может быть более точным относительно того, что вы позволите сопоставить, используя символ класс [a-z], который можно расширить, чтобы он соответствовал больше, чем az, и сделать регистр без учета регистра с помощью флага /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));
});
0 голосов
/ 22 января 2019

Вы можете использовать что-то вроде следующего (обратите внимание, что мы знаем структуру и можем лучше настроить регулярное выражение):

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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...