用于提取搜索词的正则表达式未按预期工作

Regex to extract search terms is not working as expected

我有测试字符串 ti: harry Potter OR kw: magic AND sprint: title OR ti: HARRY

并希望输出为

["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.log("next again", next);
}

console.log("parsed", parsed);

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

对于所需的匹配,您可以使用一种模式,您还可以选择匹配 ANDOR 并在捕获组 1 中获得匹配,表示为 m[1]在示例代码中。

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

在部分中,模式匹配:

  • \b 防止部分匹配的单词边界
  • (?= 断言右边的正向前瞻是
    • ( 捕获 组 1
      • [a-z0-9]+:
      • .*? 尽可能匹配除换行符外的任何字符
      • (?:非捕获组
        • (?:AND|OR) [a-z0-9]+: 匹配 ANDOR 后跟 space 和 1+ 次字符 a-z0-9 和 :
        • |
        • $ 断言字符串结束
      • )关闭非捕获组
    • ) 关闭组 1
  • ) 关闭前瞻

看到一个regex demo

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.log(result);