Julia中如何用正则匹配最外层花括号实现mintinline标记替换
问题原因
你使用的惰性匹配规则.*?会在扫描到第一个}时就终止捕获,当\mintinline{julia}{}的参数内部存在嵌套大括号时,就会出现捕获截断、剩余的}错位的问题。
解决方案
Julia的正则引擎基于PCRE2,支持递归匹配,可以专门处理这种嵌套括号的场景,直接改用支持嵌套大括号匹配的正则规则即可:
replace(row, r"\\mintinline\{julia\}\{((?:[^{}]++|\{(?1)\})++)\}" => s"`\1`")
正则规则说明
[^{}]++:占有式匹配所有非大括号的字符,避免不必要的回溯\{(?1)\}:递归调用当前捕获组的匹配规则,处理大括号嵌套的场景- 整个捕获组会自动匹配到和外层大括号配对的闭合
}为止,不会被内部嵌套的}提前截断
测试效果
对给出的原始字符串执行上述代码后,输出结果和预期完全一致:
"how `Tuple{Matrix{Int16},Int16}` are `Tuple{Int8,Int16}` you"
内容的提问来源于stack exchange,提问作者Likan Zhan
相关产品推荐
相关产品推荐

