RegEx для ввода значений во вложенных скобках - PullRequest
4 голосов
/ 25 мая 2019

Я пытался использовать регулярное выражение для сопоставления внутреннего текста между двумя символами, но я получаю неправильный текст

Я пытался поставить [Az] * вместо. * Для сопоставления только внутреннего текстаи это сработало.Но мне нужно сопоставлять и не буквенные символы.

/\[?(,? ?\[(\[(.+)-(.+)\])\])\]?/g

Это мое регулярное выражение, и я хочу сопоставить символы в квадратных скобках:

[[[* hello-hello]], [[hi -hi]]]

Полужирные символы совпадают.

Я ожидаю, чтосовпадение [[[ привет-привет ]], [[привет-привет]]] в матче 1 и [[[привет-привет]], [[ привет-привет ]]] во втором матче.

Ответы [ 5 ]

2 голосов
/ 25 мая 2019

Вы можете использовать 1 группу захвата для захвата ваших значений.

Значения до и после дефиса могут совпадать, используя отрицательный класс символов \[([^][\n-]+, который не является открытием или закрытиемскобка, дефис или новая строка.

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

\[([^\][\n-]+-[^\][\n-]+)]

Объяснение

  • \[ Совпадение [
  • ( Начало группы захвата
    • [^\][\n-]+ Класс отрицательных символов, совпадение1+ раз не ], [, - или новая строка
    • - Матч -
    • [^\][\n-]+ Матч 1+ раз не ], [, - или перевод строки
  • ) Закрыть группу захвата
  • ] Совпадение ] char

Regex demo

const regex = /\[([^\][\n-]+-[^\][\n-]+)]/g;
const str = `[[[hello-hello]],[[hi-hi]]]`;
let m;

while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  console.log(m[1]);
}
2 голосов
/ 25 мая 2019

Я бы использовал что-то вроде этого:

\[(?!\[)([^\]]*)\]

Это будет соответствовать символу [, если за ним не следует символ [.Затем он будет соответствовать любому количеству не ] символов, захвативших их в группе 1. Затем следует соответствие ] символа.

const text = "[[[hello-hello]],[[hi-hi]]]";
const regex = /\[(?!\[)([^\]]*)\]/g;
var match;

while (match = regex.exec(text)) {
  console.log(match);
}

В качестве альтернативы вы можете опустить группу захвата и удалить первый и последний символ каждого матча.

const text = "[[[hello-hello]],[[hi-hi]]]";
const regex = /\[(?!\[)[^\]]*\]/g;

console.log(
  text.match(regex)
      .map(match => match.slice(1, -1))
);
2 голосов
/ 25 мая 2019

Если бы все, что находится между [], было бы желательным, то мы могли бы упростить наше выражение до:

(?:\[+)(.+?)(?:\]+)

Здесь мы собираем нашу, вероятно, желаемую подстроку в этой группе захвата:

(.+?)

Затем мы добавляем две границы слева и справа с помощью двух групп без захвата:

(?:\[+)
(?:\]+)

Демо

const regex = /(?:\[+)(.+?)(?:\]+)/g;
const str = `[[[hello-hello]]
[[hi-hi]]]
[[hi hi]]]`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

enter image description here

RegEx

Если это выражение нежелательно, его можно изменить /изменено в regex101.com .

Схема RegEx

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

enter image description here

2 голосов
/ 25 мая 2019

Вот регулярное выражение, с которым я пришел:

\[+([a-z- A-Z]+)\]+

Демо

1 голос
/ 25 мая 2019

RegEx

(?<=\[)([a-z- A-Z]+)(?=\])

(?<=\\[): начать с скобки, но не содержит скобки.

(?=\\]): заканчивается скобкой, но не содержит скобки.

Подробные объяснения можно найти по этой ссылке .

...