You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:20:22