Javascript regex выбрать другое содержимое в строке - PullRequest
0 голосов
/ 16 июня 2020

Попытка создать регулярное выражение для извлечения / выбора элементов в закодированной строке в зависимости от порядка знаков клавиатуры:

 str = "(abc-1é,d[efg_2ç;i|jkl+3ö.(mno?4à,p[qr(st!5',uv#6^;|xyz%7_." // look strange :)

Мне нужно получить все включенные части

1) в (, -> "ab c -1é" + "mno? 4à" + "st! 5 '"

2) в [; -> "efg_2ç "+" qr (st! 5, uv # 6 ^ "

3) в | . -> "jkl + 3ö" + "xyz% 7 _"

Я перепробовал много возможностей на https://regex101.com/, и я могу произвести некоторые правильные результаты:

/\(([^()]*),/g -> catch "(abc-1é," "(mno?4à," and "(st!5'," -> OK

/\|[\w()]{0,}(...)./g -> catch "|jkl+3ö."  and  "|xyz%7_." -> OK

Не спрашивайте меня, почему, но это работает, кроме:

/\[([^()]*);/g  or /\[[\w()]{0,}(...);/g  -> catch "[efg_2ç;" but ignore "[qr(st!5',uv#6^;"

Мой вопрос: можно ли создать уникальное регулярное выражение способен уловить 3 знака-условия? что-то вроде:

 / init: \[|\(|\| -> inside: [all founded signs, any length] -> end: ,|.|; /g

и (если возможно) с некоторыми пояснениями ... Спасибо заранее

1 Ответ

1 голос
/ 16 июня 2020

Это мощное единое регулярное выражение, способное сопоставить все сразу, не существует из-за вмешательства конкурирующих шаблонов. Вместо этого можно использовать 3 шаблона, каждый из которых ограничен конкретным вариантом использования.

Возможный подход затем использует matchAll для каждого шаблона, конвертирует / деструктурирует и собирает каждый массив результатов в один массив и, наконец, наносит на карту все захваты. Такой подход также более читабелен и лучше подходит для рефакторинга / обслуживания ...

// (/(?:\((?<pc>[^,]*),)|(?:\[(?<bs>[^;]*);)|(?:\|(?<pp>[^\.]*)\.)/gm);

const regxParenthesesComma = (/\(([^,]*),/gm);
const regxBracketSemicolon = (/\[([^;]*);/gm);
const regxPipePeriod = (/\|([^\.]*)\./gm);

function extractCharacterSequences(str) {
  return [

    ...str.matchAll(regxParenthesesComma),
    ...str.matchAll(regxBracketSemicolon),
    ...str.matchAll(regxPipePeriod)

  ].map(result => result[1]);
}

const test = "(abc-1é,d[efg_2ç;i|jkl+3ö.(mno?4à,p[qr(st!5',uv#6^;|xyz%7_.";

console.log(
  'extractCharacterSequences(test) => ',
  extractCharacterSequences(test)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...