Регулярное выражение для извлечения условий поиска не работает должным образом

У меня есть тестовая строка ti: Гарри Поттер ИЛИ kw: магия И спринт: титул ИЛИ ti: ГАРРИ

и хотите, чтобы результат был как

["ti: harry Potter OR kw:", "kw: magic AND sprint:", "sprint: title OR ti:", "ti: HARRY"]

но результат, который я получаю,

["ti: harry Potter OR kw:", "kw: magic AND sprint:", "nt: title OR ti:", "ti: HARRY"]

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

const match = /[a-z0-9]{2}:.*?($|[a-z0-9]{2}:)/g;

и я извлекаю его и помещаю в массив

Я попытался заменить его на /[a-z0-9]+:.*?($|[a-z0-9]+:)/g;, но когда я увеличиваю индекс и добавляю строки для анализа, это происходит странно (это также включено в код)

Я попытался изменить {2} на n, и это также не работает должным образом.

const parsed = [];
const match = /[a-z0-9]{2}:.*?($|[a-z0-9]{2}:)/g;
const message = "ti: harry Potter OR kw: magic AND sprint: title OR ti: HARRY";
let next = match.exec(message);
while (next) {
  parsed.push(next[0]);
  match.lastIndex = next.index + 1;
  next = match.exec(message);
  console.info("next again", next);
}

console.info("parsed", parsed);

https://codesandbox.io/s/regex-forked-6op514?file=/src/index.js

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для желаемых совпадений вы можете использовать шаблон, в котором вы также можете сопоставить AND или OR и получить совпадение в группе захвата 1, которая обозначена как m[1] в примере кода.

\b(?=([a-z0-9]+:.*?(?: (?:AND|OR) [a-z0-9]+:|$)))

Частично узор совпадает:

  • \b Граница слова для предотвращения частичного совпадения
  • (?= Положительный взгляд вперед, чтобы утверждать, что то, что справа,
    • ( Снять группа 1
      • [a-z0-9]+:
      • .*? Сопоставьте любой символ, кроме новой строки, как можно меньше
      • (?: Группа без захвата
        • (?:AND|OR) [a-z0-9]+: Сопоставьте либо AND, либо OR, затем пробел и 1+ символ a-z0-9 и :
        • | Или
        • $ Утвердить конец строки
      • ) Закрыть группу без захвата
    • ) Закрыть группу 1
  • ) Закрыть просмотр вперед

См. демонстрация регулярных выражений.

const regex = /\b(?=([a-z0-9]+:.*?(?: (?:AND|OR) [a-z0-9]+:|$)))/gm;
const str = `ti: harry Potter OR kw: magic AND sprint: title OR ti: HARRY`;
const result = Array.from(str.matchAll(regex), m => m[1]);
console.info(result);

Можно ли расширить это, чтобы позаботиться и об этом ti: harry Potter kw: magic sprint: title ti: HARRY? Нелогический термин?

keerti 22.03.2022 22:10

@keerti Нравится это? \b(?=([a-z0-9]+:.*?(?:[a-z0-9]+:|$)))regex101.com/r/bw49bs/1

The fourth bird 22.03.2022 22:42

Другие вопросы по теме