Rascal v0.18.2中rexpMatch函数转义字符解析错误求解决办法
Rascal v0.18.2中rexpMatch转义字符问题的解决方法
问题说明
你执行代码时出现的解析错误,根源在于Rascal的普通字符串会优先处理内部转义字符:当你传入"\."时,\.并不是Rascal字符串的合法转义序列,直接触发解析失败;同时rexpMatch接收的正则表达式,也需要考虑字符串层面的转义传递规则。
解决方法
方法1:使用原始字符串
Rascal支持r"..."格式的原始字符串,这类字符串不会处理内部的转义字符,可直接将正则表达式内容原样传递给rexpMatch:
import String; public bool Match(str line, str reg) { return rexpMatch(line, reg); } Match(".", r"\.");
方法2:双重转义
如果不使用原始字符串,需要在字符串层面做双重转义:用\\表示正则所需的单个\,让最终传递给rexpMatch的内容是\.:
import String; public bool Match(str line, str reg) { return rexpMatch(line, reg); } Match(".", "\\.");
原理补充
- 普通字符串(
"...")会解析内部转义,比如\n会被处理为换行符,但\.不属于合法转义,因此报错。 - 原始字符串(
r"...")会跳过所有转义处理,直接把内容交给正则引擎,适合直接编写正则表达式。 - 双重转义时,
\\在字符串层面会被解析为单个\,最终正则引擎拿到的是\.,符合匹配字面量.的需求。
内容的提问来源于stack exchange,提问作者Bright
相关产品推荐
相关产品推荐

