javascript - unicode 标志不适用于 Javascript 中的 RegEx

标签 javascript regex

我的代码无法检测运算符和非英语字符的使用:

const OPERATOR_REGEX = new RegExp(
  /(?!\B"[^"|“|”]*)\b(and|or|not|exclude)(?=.*[\s])\b(?![^"|“|”]*"\B)/,
  'giu'
);

const query1 = '(Java or "化粧" or 化粧品)';
const query2 = '(Java or 化粧 or 化粧品)';

console.log(query1.split(OPERATOR_REGEX));
console.log(query2.split(OPERATOR_REGEX));

https://codepen.io/thewebtud/pen/vYraavd?editors=1111

而相同的代码使用 unicode 标志成功检测 regex101.com 上的所有运算符: https://regex101.com/r/FC84BH/1

如何解决 JS 的这个问题?

最佳答案

请记住

  • \b (wordord boundary)可以写为(?:(?<=^)(?=\w)|(?<=\w)(?=$)|(?<=\W)(?=\w)|(?<=\w)(?=\W))
  • \B (non-word boundary)可以写成 (?:(?<=^)(?=\W)|(?<=\W)(?=$)|(?<=\W)(?=\W)|(?<=\w)(?=\w))

并且支持 Unicode \w模式是[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}] (参见 Replace certain arabic words in text string using Javascript ),这是 ECMAScript 2018+ 解决方案:

const w = String.raw`[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]`;
const nw = String.raw`[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]`;
const uwb = String.raw`(?:(?<=^)(?=${w})|(?<=${w})(?=$)|(?<=${nw})(?=${w})|(?<=${w})(?=${nw}))`;
const unwb = String.raw`(?:(?<=^)(?=${nw})|(?<=${nw})(?=$)|(?<=${nw})(?=${nw})|(?<=${w})(?=${w}))`;

const OPERATOR_REGEX = new RegExp(
  String.raw`(?!${unwb}"[^"“”]*)${uwb}(and|or|not|exclude)(?=.*\s)${uwb}(?![^"“”]*"${unwb})`,
  'giu'
);

const query1 = '(Java or "化粧" or 化粧品)';
const query2 = '(Java or 化粧 or 化粧品)';

console.log(query1.split(OPERATOR_REGEX));
console.log(query2.split(OPERATOR_REGEX));

关于javascript - unicode 标志不适用于 Javascript 中的 RegEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74611855/

相关文章:

javascript - 如果找到一个或多个空格则拆分

html - 如何在非 html 文件中找到 html 标签?

javascript - 拉斐尔动画路径

regex - 在 Perl 正则表达式中转义特殊字符

ruby-on-rails - 正则表达式只允许数字并且必须以 '#' 符号结尾

javascript - 每个按钮单击 : jQuery 时, map 都会附加到模态主体

regex - 使用 PCRE Regex 匹配具有特殊字符的 JSON 值

javascript - CSS - 制作一个 div "clickable"

javascript - 如何延迟内联 Javascript?

javascript - 当表位于可滚动 div 中时,如何使用 jquery 使表行滚动到 View 中?