首页 > 解决方案 > 正则表达式:匹配字符串之外的字符串对

问题描述

我正在尝试将配对字符串之外的一组字符串与正则表达式匹配。

至少有一篇关于此的帖子,但是我不清楚它是如何工作的。正则表达式匹配括号外的文本

例如,示例字符串为:

<= \( <= \) <= \( <= \) <= \( <= \)

我当前的正则表达式使用了后向和前瞻,尽管这不起作用:

(?<=(\\\)))<=(?=(\\\())

我想匹配不在之间的 <= ,\( \)所以我可以用 &le 替换它来获得:

&le \( <= \) &le \( <= \) &le \( <= \)

请注意,\( \)可能存在也可能不存在。

标签: javascriptregex

解决方案


您必须为此使用替换功能。匹配\(最终后跟\), OR 匹配<=。如果括号匹配,则替换为整个匹配项(以保持括号内的内容不变) - 否则,将<=匹配项替换为&le

const input = String.raw`<= \( <= \) <= \( <= \) <= \( <= \)`;
const output = input.replace(
  /\\(.*?\\)|<=/g,
  match => match === '<=' ? '&le' : match
);
console.log(output);

\\(.*?\\)|<=表示匹配:

  • \\(- 文字反斜杠,后跟(
  • .*?- 任何字符,直到遇到
  • \\)- 文字反斜杠,后跟)

或匹配

  • <=- 普通字符<=

(如果 JS 引擎更高级,也可以不用替换功能,例如\\(.*?\\)(*SKIP)(*FAIL)|<=,但 JS 不支持)

在 Javascript 中使用lookbehind 时要小心——只有非常新的浏览器支持它。许多较旧的浏览器无法理解它,并且会抛出错误。如果您希望您的网站为尽可能多的访问者服务,最好尽可能避免使用后向搜索,至少在可预见的未来是这样。


推荐阅读