在不支持前后瞻的CodeMirror中,如何用正则匹配=FUNCTION(...)以外内容?
问题与解决方案
环境与需求
使用CodeMirror编辑器,基于JavaScript环境,不支持正则前后瞻语法,仅能提供纯正则表达式实现内容高亮,无法编写额外代码。
语法规则要求所有内容必须写在单个根函数内,正确写法示例:
=FUNCTION(X="t")
错误写法示例(根函数外存在多余内容):
=FUNCTION(X="t")=()
需要编写正则表达式,匹配**=FUNCTION(...)根函数之外的所有内容**(如上述错误示例中的=()),匹配效果参考以下示例(^^^标记为需高亮的匹配部分):
示例1:
=FUNCTION(...)=() ^^^
示例2:
=FUNCTION(X="t")=() ^^^
示例3:
=FUNCTION(X="t"()()())=() ^^^
示例4:
=FUNCTION(X="t"()()())=(()=() ^^^^^^^
示例5:
=FUNCTION(X="t"()()())=XXXXXX ^^^^^^^
示例6:
=FUNCTION(X="t"""()()())=XXXXXX ^^^^^^^
示例7:
=FUNCTION(X="t"""()()(), X()="b")=XXXXXX ^^^^^^^
可行正则表达式
^(?:(?!=FUNCTION\()).)*|(?:=FUNCTION\((?:[^()""]|"(""|[^"])*"|\((?:[^()""]|"(""|[^"])*"|\([^()""]|"(""|[^"])*"\))*\))\)(.*)$
正则说明
匹配前缀错误内容:
^(?:(?!=FUNCTION\()).)*
匹配字符串开头到=FUNCTION(之前的所有内容,也就是根函数前的非法内容。匹配后缀错误内容:
(?:=FUNCTION\((?:[^()""]|"(""|[^"])*"|\((?:[^()""]|"(""|[^"])*"|\([^()""]|"(""|[^"])*"\))*\))\)(.*)$- 首先完整匹配合法的
=FUNCTION(...)根函数(正确处理嵌套括号、含连续双引号的字符串); - 然后匹配根函数结束括号
)之后的所有内容,也就是根函数后的非法内容。
- 首先完整匹配合法的
该正则通过全局匹配,可以同时捕获根函数前后的所有非法内容,完全符合需求且未使用前后瞻语法。
内容的提问来源于stack exchange,提问作者Pandorque
相关产品推荐
相关产品推荐

