用于提取搜索词的正则表达式未按预期工作
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
对于所需的匹配,您可以使用一种模式,您还可以选择匹配 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
后跟 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);
我有测试字符串 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
对于所需的匹配,您可以使用一种模式,您还可以选择匹配 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
后跟 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);