RPLY词法分析器适配的支持嵌套的非贪婪字符串正则匹配方案咨询
解决方案
1. 正则替换(完全无分组,非贪婪匹配)
你原来的正则使用了非捕获组、捕获组且默认贪婪,不符合要求,直接替换为无分组的非贪婪版本即可:
- 单行字符串用:
`.*?` - 多行字符串(支持换行)用:
`[\s\S]*?`
上述正则没有任何分组,完全符合RPLY的限制,*?是非贪婪匹配标识,会在遇到第一个闭合反引号时就停止匹配,不会跨多个字符串吞掉中间内容。
2. 支持内部嵌套反引号
如果需要字符串内部可以嵌套反引号,参考Markdown围栏字符串的逻辑,按反引号数量从多到少添加多条STRING规则即可,优先匹配更长的边界:
# 3个反引号边界,内部可嵌套1、2个反引号 self.__lexer.add('STRING', r'```[\s\S]*?```') # 2个反引号边界,内部可嵌套1个反引号 self.__lexer.add('STRING', r'``[\s\S]*?``') # 1个反引号边界 self.__lexer.add('STRING', r'`[\s\S]*?`')
只要内部反引号的连续数量少于边界的反引号数量,就不会被误判为字符串结束符。
3. 词法规则顺序调整
必须把STRING的规则添加在OPEN_STATEMENT、CLOSE_STATEMENT规则之前,RPLY的词法分析器会按添加顺序优先匹配先注册的规则,这样字符串内部的{、}就会被识别为STRING的内容,不会被拆成独立的语法符号。
4. 后续处理保持不变
你现有的__removeFirstLast工具函数可以正常使用,正则匹配到的STRING token会完整保留首尾的反引号,调用该函数即可去掉边界符号,拿到内部的字符串内容,不需要额外修改解析逻辑。
内容的提问来源于stack exchange,提问作者acaiberii
相关产品推荐
相关产品推荐

