如何使用nom解析字符串字面量中的转义字符?
解决nom解析带转义引号的字符串字面量问题
你的核心问题是take_until会无脑匹配第一个出现的终止引号,不管它是否被转义,导致带转义引号的字符串提前终止解析。以下是几个实用的解决思路:
自定义扫描逻辑替代
take_until
放弃现成的take_until,实现一个逐字符扫描的解析器:- 遇到普通字符直接纳入结果;
- 遇到反斜杠
\时,跳过下一个字符(将\和后续字符视为转义序列,不把后续的引号当成终止符); - 遇到未被转义的目标引号(与开头匹配的单/双引号)时停止扫描。
可以结合nom的many_till、peek和take组合子来实现这个逻辑,精准控制终止条件。
使用nom内置的
escaped组合子
nom的bytes::complete::escaped是专门处理带转义序列的工具,能直接适配你的需求:- 指定普通字符的匹配规则(非转义符、非终止引号);
- 设置转义符为
\; - 指定需要转义的目标引号(单/双引号,根据开头的引号类型动态选择)。
这个组合子会自动处理转义逻辑,把转义序列转换成对应的原字符,同时正确跳过转义后的引号,不会误判为终止符。
动态匹配对应引号的转义规则
先解析开头的引号类型(单/双),然后针对该类型使用专属的解析规则:- 比如开头是双引号,就只把未被
\转义的"视为终止符; - 开头是单引号,就只把未被
\转义的'视为终止符。
这种方式能避免不同引号类型的干扰,让逻辑更清晰。
- 比如开头是双引号,就只把未被
内容的提问来源于stack exchange,提问作者Eray Erdin
相关产品推荐
相关产品推荐

