gpt4 book ai didi

javascript - 正则表达式匹配除 AND、OR 和 NOT 之外的所有单词

转载 作者:行者123 更新时间:2023-11-29 10:37:18 32 4
gpt4 key购买 nike

在我的 javascript 应用程序中,我有这个随机字符串:

büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)

我想匹配除单词 ANDORNOT 之外的所有单词特殊字符和数字。

我试过是这个

/(?!AND|OR|NOT)\b[\u00C0-\u017F\w\d]+/gi
结果是
[“büert”、“3454jhadf”、“asdfsdf”、“technüology”、“bar”、“bas”]

但是由于 \b 单词边界,这个不匹配单词开头或结尾处的 ü 或 a-z 字母表之外的任何其他字母.

奇怪地删除 \b 以匹配部分或我想排除的词结束:

/(?!AND|OR|NOT)[\u00C0-\u017F\w\d]+/gi
结果是
[“büert”、“ND”、“OT”、“3454jhadf”、“üasdfsdf”、“R”、“technüology”、“ND”、“bar”、“R”、“bas”]

匹配所有单词的正确方法是什么,无论它们包含什么类型的字符以及我想要排除的字符?

最佳答案

这里的问题的根源在于 \b (和 \w 以及其他速记类)在 JavaScript 中不支持 Unicode。

现在,有两种方法可以实现您想要的效果。

1。拆分您想要丢弃的模式

var re = /\s*\b(?:AND|OR|NOT)\b\s*|[()]/;
var s = "büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)";
var res = s.split(re).filter(Boolean);
document.body.innerHTML += JSON.stringify(res, 0, 4);
// = > [ "büert", "3454jhadf üasdfsdf", "technüology", "bar", "bas" ]

注意非捕获组的使用(?:...)以免将不需要的词包含到结果数组中。此外,您需要将所有标点符号和其他不需要的字符添加到字符类中。

2。使用自定义边界匹配

您可以像这样在正则表达式中使用带有 anchor /反向否定字符类的分组:

(^|[^\u00C0-\u017F\w])(?!(?:AND|OR|NOT)(?=[^\u00C0-\u017F\w]|$))([\u00C0-\u017F\w]+)(?=[^\u00C0-\u017F\w]|$)

捕获组 2 将包含您需要的值。

参见 regex demo

JS代码演示:

var re = /(^|[^\u00C0-\u017F\w])(?!(?:AND|OR|NOT)(?=[^\u00C0-\u017F\w]|$))([\u00C0-\u017F\w]+)(?=[^\u00C0-\u017F\w]|$)/gi; 
var str = 'büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)';
var m;
var arr = [];
while ((m = re.exec(str)) !== null) {
arr.push(m[2]);
}
document.body.innerHTML += JSON.stringify(arr);

或者用一个 block 来动态构建正则表达式:

var bndry = "[^\\u00C0-\\u017F\\w]";
var re = RegExp("(^|" + bndry + ")" + // starting boundary
"(?!(?:AND|OR|NOT)(?=" + bndry + "|$))" + // restriction
"([\\u00C0-\\u017F\\w]+)" + // match and capture our string
"(?=" + bndry + "|$)" // set trailing boundary
, "g");
var str = 'büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)';
var m, arr = [];
while ((m = re.exec(str)) !== null) {
arr.push(m[2]);
}
document.body.innerHTML += JSON.stringify(arr);

解释:

  • (^|[^\u00C0-\u017F\w]) - 我们的自定义边界(匹配以 ^ 开头的字符串或 [\u00C0-\u017F\w] 范围之外的任何字符)
  • (?!(?:AND|OR|NOT)(?=[^\u00C0-\u017F\w]|$)) - 对匹配的限制:如果有 AND 则匹配失败或 ORNOT后跟字符串结尾或 \u00C0-\u017F 中以外的字符范围或非单词字符
  • ([\u00C0-\u017F\w]+) - 匹配单词字符 ( [a-zA-Z0-9_] ) 或来自 \u00C0-\u017F 的字符范围
  • (?=[^\u00C0-\u017F\w]|$) - 尾部边界,字符串结尾 ( $ ) 或除 \u00C0-\u017F 之外的字符范围或非单词字符。

关于javascript - 正则表达式匹配除 AND、OR 和 NOT 之外的所有单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34656179/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com