求匹配PostgreSQL运算符名的JavaScript正则表达式
PostgreSQL运算符名匹配正则(适配moo库)
直接给出可在moo中使用的正则表达式(两种形式,按需选择):
正则表达式字面量
/^(?=.{1,63}$)(?!.*(--|\/\*))(?:[-+*\/<>=~!@#%^&|`?]|(?=.*[!@#%^&|`?])[-+*\/<>=~!@#%^&|`?]{2,63}(?<=[+-])|[-+*\/<>=~!@#%^&|`?]{2,63}(?<![+-]))$/
字符串形式(适合moo的规则定义)
"^(?=.{1,63}$)(?!.*(--|\\/\\*))(?:[-+*\\/<>=~!@#%^&|`?]|(?=.*[!@#%^&|`?])[-+*\\/<>=~!@#%^&|`?]{2,63}(?<=[+-])|[-+*\\/<>=~!@#%^&|`?]{2,63}(?<![+-]))$"
规则拆解
每个部分对应你的需求:
^(?=.{1,63}$):强制匹配的字符串长度在1到63字符之间,符合PostgreSQL的标识符长度限制(?!.*(--|\/\*)):负向预查,确保字符串中不包含--或/*这两个注释起始序列- 非捕获组
(?:...)包含三种合法情况:[-+*\/<>=~!@#%^&|?]`:匹配单字符运算符,允许所有指定的特殊字符(?=.*[!@#%^&|?])[-+*/<>=~!@#%^&|`?]{2,63}(?<=[+-])`:匹配多字符且以`+`/`-`结尾的运算符,通过正向预查确保字符串中至少包含`!@#%^&|`?`中的一个字符[-+*\/<>=~!@#%^&|?]{2,63}(?<![+-]):匹配多字符且**不以**+/-结尾的运算符,通过反向后顾排除结尾为+或-`的情况
moo库使用示例
比如定义一个operator词法规则:
const moo = require('moo'); const lexer = moo.compile({ operator: /^(?=.{1,63}$)(?!.*(--|\/\*))(?:[-+*\/<>=~!@#%^&|`?]|(?=.*[!@#%^&|`?])[-+*\/<>=~!@#%^&|`?]{2,63}(?<=[+-])|[-+*\/<>=~!@#%^&|`?]{2,63}(?<![+-]))$/, // 其他规则... });
测试验证
- 合法案例:
!、@-、<>、!+、%&| - 非法案例:
--(包含注释序列)、/*(包含注释序列)、+-(多字符以-结尾且无指定特殊字符)、++++(多字符以+结尾且无指定特殊字符)、abc(含非允许字符)
内容的提问来源于stack exchange,提问作者Tim Needham
相关产品推荐
相关产品推荐

