Извлечь все группы после символа с помощью регулярного выражения - PullRequest
0 голосов
/ 31 октября 2019

Цель состоит в том, чтобы извлечь все пары ключ / значение из строки, имеющей следующий формат:

(&(foo=bar)(goo=car)) или (|(foo=bar)(goo=car)(hoo=dar))

Я не знаю, сколько там групп, может быть 2, может быть 50.

Мне нужно извлечь оператор ( & или | ) и отдельные параметры.

Я попробовал следующее регулярное выражение, но оно игнорирует первую группу:

([|&])((\(.*?=.*?\)))+

Как мне получить все группы?

моя попытка

РЕДАКТИРОВАТЬ

Я думаю, я мог бы заставить ее работать, применив 2 регулярных выражения

\(([|&])(.*)\)

это извлечет только содержимое

(foo=bar)(goo=car)

, и это извлечет содержимое

\((.*?)\)

foo=bar, goo=car

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

let match = null;
const regex = /(\([^&|]+?=.+?)\)/g;
while (match = regex.exec('(&(foo=bar)(goo=car))')) {
  console.log(match[0]);
}
1 голос
/ 03 ноября 2019

Мне удалось сделать все, как ожидалось


@Injectable()
export class QueryService {

regex1: RegExp = new RegExp("^\\(([|&])(.*)\\)");
regex2: RegExp = new RegExp("\\(([&|]\\(.*\\)\\(.*?\\)).*?\\)|\\(.*?\\)", "g");
regex3: RegExp = new RegExp("\\((.*?)\\)");

constructor(){}

decode(query: string): Query {
    if (!this.regex1.test(query)) {
      console.error("Error while parsing query", query);
      return;
    }
    const matches = query.match(this.regex1);
    const parts = {
      operator: matches[1] as QueryConditions,
      content: matches[2].match(this.regex2)
    };

    return new Query(parts.operator, this._getQueryFields(parts.content));
}

private _getQueryFields(content: string[]): GenericObject {
    const mapped: GenericObject = {};
    forEach(content, (g) => {
      if (this.regex1.test(g)) {
        mapped.group = this.decode(g);
      }
      else {
        //
        const pair = g.match(this.regex3)[1].split("=");
        mapped[pair[0]] = pair[1];
      }
    });

    return mapped;
  }

}

Где-то в моем приложении

source: string = new Query("&", {
    foo: "bar",
    goo: "car",
    group: new Query("&", {
      firstName: "john",
      lastName: "doe"
    })
}).generate();

decoded: Query = this._queryService.decode(source);

// source = (&(foo=bar)(goo=car)(&(firstName=john)(lastName=doe)))

// decode will produce a map 
/* {
     operator: "&",
     fields: {
        foo: "bar",
        goo: "car",
        group: {
           operator: "&",
           fields: {
               firstName: "john",
               lastName: "doe"
           }
       }
   } */

Конечно, я могу работать с несколькими группами на одном уровне, но пока этого достаточно,Я буду постепенно улучшать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...