Regex для анализа нескольких условий для групп - PullRequest
3 голосов
/ 02 июня 2019

Я пытаюсь разбить строку на 3 части с помощью регулярного выражения.

Я могу получить только параметры функции из строки, но я также хочу другие части строки

const regex = /(\(.*?\))+/g;
const sampleString = 'collection.products(take:12|skip:16)';
const result = sampleString.match(regex)

Это дает мне (take:12|skip:16)

Но я также хочу получить collection и products

Ожидаемый результат в матче

  1. collection

  2. products

  3. take:12|skip:16

Ответы [ 3 ]

2 голосов
/ 02 июня 2019

Здесь мы можем изменить два выражения вместе:

(\w+)|\((.+?)\)

какая группа # 1 будет захватывать нужные слова (\w+), а группа # 2 - требуемый вывод в скобках.

const regex = /(\w+)|\((.+?)\)/gm;
const str = `collection.products(take:12|skip:16)`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Демо

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

2 голосов
/ 02 июня 2019

Это разделяется на то, что вы хотите.

const sampleString = 'collection.products(take:12|skip:16)';
const result = sampleString.split(/[.()]*([^.()]+)[.()]*/).filter(function (el) {return el != "";});

console.log(result)
2 голосов
/ 02 июня 2019

Вы можете разделить строку на . и (\(.*?\))+, а затем использовать уменьшить, чтобы получить значения в нужном формате

const sampleString = 'collection.products(take:12|skip:16)';
const result = sampleString.split(/\.|(\(.*?\))+/).reduce((op,inp) => {
  if(inp){
    inp = inp.replace(/[)(]+/g,'')
    op.push(inp)
  }
  return op
},[])

console.log(result)
...