У меня есть тестовая строка 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
Для желаемых совпадений вы можете использовать шаблон, в котором вы также можете сопоставить 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);
@keerti Нравится это? \b(?=([a-z0-9]+:.*?(?:[a-z0-9]+:|$)))
regex101.com/r/bw49bs/1
Можно ли расширить это, чтобы позаботиться и об этом
ti: harry Potter kw: magic sprint: title ti: HARRY
? Нелогический термин?