# @digitak/grubber 中文文档

规范地址：https://npmcn.com/package/%40digitak/grubber/

版本：3\.1\.4
npm 元数据更新时间：2023-01-21T15:21:17.142Z
中文译文更新时间：2026-11-12T08:24:28.732Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40digitak/grubber
原文对照：https://npmcn.com/package/%40digitak/grubber/?lang=original
项目主页：https://github.com/digital-loukoum/grubber#readme
源码仓库：https://github.com/digital-loukoum/grubber

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：28.1 kB，40 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：0 个
- 首次发布：2021-04-16T10:05:32.829Z
- 最新版本发布：2023-01-21T15:21:17.059Z
- 近 30 天下载量：209861（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：17（近 12 个月 0 个）

## 中文简介

解析代码文件并补丁它而无需使用 AST

## 安装

```sh
npm install @digitak/grubber
```

也可以使用：`pnpm add @digitak/grubber`、`yarn add @digitak/grubber`、`bun add @digitak/grubber`

## README

**_咕噜声_** 以100%的安全方式分析正则表达式的代码

在更高层次上,Grubber也暴露出帮助器功能来解析一个文件在许多语言中的依赖性(Javascript, Typescript, Cs, Scs, Python, Rust, C / C++, Nim,.

## 怎么会?

用正则表达式解析源文件的问题在于,您无法确定您的匹配没有被评论或没有在字符串内被评论.

比如说你在寻找所有人 `const` 在 Javascript 文件中的语句 - 您将使用类似 :

```ts
/\bconst\s+/g;
```

但是,如果你想要分析的文件 是类似的东西:

```ts
const x = 12;
// const y = 13;
let z = "const ";
```

那你就跟三个比 `const` 当只有一个应该匹配.

Grubber理解什么是字符串,什么是评论和代码,这样你就可以非常轻松地克服这个问题:

```ts
import { grub } from "@digitak/grubber";

const content = `
const x = 12
// const y = 13
let z = "const "
`;

const results = grub(content).find(/\bconst\s+/);
console.log(results.length); // will print 1 as expected
```

> 为了示威,我们使用了简单的regex,但记住Ecmascript是一个棘手的语言! 有效寻找所有 `const` 声明需要更精细的规范。 实例: `foo.const = 12` 将匹配。 语言在每个语句结尾处使用分号或严格缩进,以100%安全的方式解析要容易得多.

## 安装

使用您最喜欢的软件包管理器 :

```
npm install @digitak/grubber
```

## 格鲁贝尔 API

Grubber 输出一个主要函数 `grub`数字 :

```ts
export function grub(
    source: string,
    languageOrRules: LanguageName | Rule[] = "es",
): {
    // find one or more expressions and return an array of fragments
    find: (...expressions: Array<string | RegExp>) => Fragment[];

    // replace one or more expressions and return the patched string
    replace: (
        ...fromTos: Array<{
            from: string | RegExp;
            to: string | RegExp;
        }>
    ) => string;

    // find all dependencies (ex: `imports` in Typescript, `use` in Rust)
    findDependencies: () => Fragment[];

    // replace all dependencies by the given value
    // you can use special replace patterns like "$1" to replace
    // with the first captured group
    replaceDependencies: (to: string) => string;
};
```

这个 `find` 财务报告和审定财务报表 `findDependencies` 两种方法都返回一系列碎片:

```ts
export type Fragment = {
    slice: string; // the matched substring
    start: number; // start of the matched substring
    end: number; // end of the matched substring
    groups: string[] = []; // the captured groups
};
```

### 使用预设语言之一的bber

您可以使用任何预设语言 :

```ts
export type LanguageName =
    | "es" // Ecmascript (Javascript / Typescript / Haxe): the default
    | "rs" // Rust
    | "css"
    | "scss"
    | "sass"
    | "c"
    | "cpp"
    | "py" // Python
    | "nim";
```

示例

```ts
// find all semi-colons inside the rust source code
grub(rustCodeToParse, "rs").find(";");
```

### 使用自定义规则的 grubber

您可以定义 grubber 解析器的自定义规则 。 什么应该被忽略 作为"不是代码".

A 类 `Rule` 有下列类型:

```ts
export type Rule =
    | {
            expression: string | RegExp; // the expression to ignore

            // if returns false, the match is ignored
            onExpressionMatch?: (match: RegExpExecArray) => boolean | void;
      }
    | {
            startAt: string | RegExp; // start of the expression to ignore
            stopAt: string | RegExp; // stop of the expression to ignore

            // if returns false, the match is ignored
            onStartMatch?: (match: RegExpExecArray) => boolean | void;
            onStopMatch?: (match: RegExpExecArray) => boolean | void;
      };
```

例如,《公约》使用的规则 `C` 语言为:

```ts
const rules: Rule[] = [
    {
        // string
        expression: /".*?[^\\](?:\\\\)*"/,
    },
    {
        // single line comment
        expression: /\/\/.*/,
    },
    {
        // multiline comment
        expression: /\/\*((?:.|\s)*?)\*\//,
    },
];
```

> 对于大多数语言来说,规则相当简单,但对Ecmascript来说则变得复杂,因为 `${...}` 语法. 希望工作已经为你完成!

{\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢

## 常见问题

### @digitak/grubber 是什么？

解析代码文件并补丁它而无需使用 AST

### 如何安装 @digitak/grubber？

在项目目录运行 npm install @digitak/grubber，或使用 pnpm add / yarn add / bun add。

### @digitak/grubber 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @digitak/grubber 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @digitak/grubber 可以商用吗？

@digitak/grubber 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @digitak/grubber 的下载量有多少？

根据 npm 官方下载统计，@digitak/grubber 在 2026/10/12 – 2026/11/10 这 30 天内被下载 209,861 次，日均约 6,995 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @digitak/grubber 还在维护吗？

最新版本 3\.1\.4 发布于 2023/01/21（3 年前）；至今共发布 17 个版本，其中过去 12 个月发布了 0 个；首次发布于 2021/04/16。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

