如何用正则提取Rust结构体名称及其内部字段信息?
提取Rust结构体内部字段的解决方案
要提取结构体内部的字段,你可以分两步实现:先匹配出结构体的完整范围(包含大括号内的内容),再从捕获的内部文本中解析每个字段。
步骤1:匹配结构体名称与内部内容
修改正则表达式,同时捕获结构体名称和大括号之间的字段文本,兼容换行和空格:
const structRegex = /pub struct\s+(?<name>[$_\p{ID_Start}][$\u200c\u200c\p{ID_Continue}]*)\s*\{\s*(?<fields>[^}]+)\s*\}/u;
步骤2:解析单个字段
用另一个正则从捕获的字段文本中,提取每个字段的名称和类型:
const fieldRegex = /pub\s+(?<name>[$_\p{ID_Start}][$\u200c\u200c\p{ID_Continue}]*)\s*:\s*(?<type>[$_\p{ID_Start}][$\u200c\u200c\p{ID_Continue}]*),?/gu;
完整实现代码
把逻辑整合到parseCode函数中:
const stringCode = ` #[account] pub struct Tweet { pub author: Pubkey, pub timestamp: i64, pub topic: String, pub content: String, } `; const structRegex = /pub struct\s+(?<name>[$_\p{ID_Start}][$\u200c\u200c\p{ID_Continue}]*)\s*\{\s*(?<fields>[^}]+)\s*\}/u; const fieldRegex = /pub\s+(?<name>[$_\p{ID_Start}][$\u200c\u200c\p{ID_Continue}]*)\s*:\s*(?<type>[$_\p{ID_Start}][$\u200c\u200c\p{ID_Continue}]*),?/gu; const parseCode = () => { const structMatch = structRegex.exec(stringCode); if (!structMatch) return null; const { name, fields } = structMatch.groups; const fieldMatches = [...fields.matchAll(fieldRegex)]; const parsedFields = fieldMatches.map(match => ({ name: match.groups.name, type: match.groups.type })); return { structName: name, fields: parsedFields }; }; // 测试调用 console.log(parseCode());
输出结果
运行后会得到结构化的对象:
{ structName: "Tweet", fields: [ { name: "author", type: "Pubkey" }, { name: "timestamp", type: "i64" }, { name: "topic", type: "String" }, { name: "content", type: "String" } ] }
注意事项
- 上述正则仅适用于格式规范的简单结构体(字段均为
pub修饰、无嵌套/泛型/复杂类型)。如果需要处理更复杂的Rust语法,建议使用专门的解析库(比如tree-sitter-rust),避免正则的局限性。
内容的提问来源于stack exchange,提问作者tolgaandx
相关产品推荐
相关产品推荐

