关于 Strings-LE
Strings-LE 从配置文件、数据文件和源代码中提取字符串值,并在编辑器中生成结果,也可通过 CLI 扫描文件树。它支持多种结构化格式与编程语言,并提供 CSV 列选择和大文件流式处理。
主要功能
- 01提取 JSON、YAML、TOML 等字符串值
- 02解析多种编程语言的字符串
- 03CSV 列选择与流式处理
- 04支持去重、排序和位置显示
- 05提供编辑器、CLI 与 MCP
适用场景
- 01整理本地化文件中的待翻译文本
- 02审查配置文件中的字符串值
- 03从大型 CSV 中提取指定列
- 04汇总代码库中的用户可见文本
MCP 相关
MCP 服务通过 stdio 提供 extract_strings,解析输入内容并按文档顺序返回字符串值,可配置格式、去重、多行处理和结果上限;服务不读取文件或发起网络请求。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| dedupe | boolean | 否 | 将重复值合并,仅保留首次出现的值。 |
| format | enum | 否 | 文档格式。省略或无法识别格式时,将回退到提取带引号的字符串。json | jsonc | yaml | csv | tsv | toml | ini | env | python | rust | go | shellscript | php | ruby | perl | csharp | javascript | typescript | fallback |
| content | string | 是 | 要扫描的文档文本。 |
| filename | string | 否 | 用于在 `format` 未指定时推断格式的文件名,例如 "config.toml"。 |
| multiline | boolean | 否 | 对于此处无法解析的格式,允许带引号的字符串跨越多行,以便读取多行模板字面量或消息。对于自身字符串可跨行的语言,无论如何都会按此方式读取。 |
| maxResults | integer | 否 | 返回字符串数量上限(默认 500)。meta.truncated 用于报告是否有内容被丢弃。 |
详细介绍
Strings-LE:轻松提取字符串
一键提取当前文件中的所有字符串值
支持 JSON/JSONC、YAML、CSV/TSV、TOML、INI、环境文件和十种源代码语言
觉得好用? 点赞或评分能让其他开发者发现它 — ★ GitHub · ★ Open VSX · ★ Marketplace
功能介绍
打开文件,运行 String-LE: Extract Strings,文档中的所有字符串值都会出现在新的编辑器中,然后即可进行去重和排序。支持 VS Code,以及 Cursor 和 VSCodium 等基于 VS Code 的编辑器(可从 Open VSX 安装)。
- i18n 准备 — 将语言环境文件(JSON/YAML)展平为简洁的待翻译值列表
- 配置审查 — 一目了然地查看 TOML/INI/.env 文件中的所有字符串值
- CSV 挖掘 — 提取一列、多列或全部列;支持流式处理超大文件
安装
| 平台 | 可获得的功能 | 安装 |
|---|---|---|
| VS Code | 在编辑器中一键完成同样的提取 | Marketplace |
| Cursor、VSCodium、Windsurf | 同一款扩展 | Open VSX |
| 终端或 CI 步骤 | 对整个目录树执行相同操作,并返回退出代码 | npx strings-le · npm 或 cargo install string-le · crates.io |
| 任何 MCP Agent,通过 Node 使用 | 通过标准输入输出调用 extract_strings | npx string-le-mcp · npm |
在 AI Agent 中使用
相同的引擎也可作为 MCP 服务运行,因此 Agent 可以直接调用它,无需你运行命令。
| 编辑器 | 用法 |
|---|---|
| VS Code 1.101+ | 无需安装任何内容 — 扩展会在 Agent 模式下注册 extract_strings |
| Claude Code | claude mcp add string-le -- npx -y string-le-mcp |
| Cursor、Windsurf 及其他工具 | 将其指向 npx string-le-mcp |
extract_strings(content, format?, filename?, dedupe?, multiline?, maxResults?)
按文档顺序返回值,默认最多返回 500 个,并通过 meta.truncated 标示是否截断。格式为可选项 — 无法识别的格式会回退到带引号的字符串。
服务接收内容并返回数据 — 不会读取任何文件,也不会自行发出网络请求。它以 string-le-mcp 的名称发布在 npm 上,并以 io.github.nolindnaidoo/string-le 的名称发布在 MCP 注册表中。
手动配置 — 任何带有 MCP 配置文件的宿主
大多数宿主都读取 JSON 配置。添加一个条目:
{
"mcpServers": {
"string-le": {
"command": "npx",
"args": ["-y", "string-le-mcp"]
}
}
}
首次运行时,-y 会跳过安装提示。如果不想跟踪发布版本,也可以固定版本 — [email protected]。
不想每次启动都通过 npx?可以安装一次,然后指向对应的二进制文件:
npm install -g string-le-mcp
{
"mcpServers": {
"string-le": { "command": "string-le-mcp" }
}
}
它通过 stdio 使用 MCP 通信,无需环境变量、API 密钥或自行配置。将它接入其他内容前,可以先检查:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y string-le-mcp
这会打印工具列表并退出 — 如果看到 extract_strings,说明服务运行正常。
支持的格式
| 格式 | 语言 ID | 提取内容 |
|---|---|---|
| JSON | json | 字符串值(解析后提取;不包括键、数字和布尔值) |
| YAML | yaml | 字符串值,包括未加引号的普通标量、块标量/折叠标量和多文档文件 |
| CSV | csv | 单元格,支持可选的表头处理、列选择,以及适用于大型文件的流式模式 |
| TOML | toml | 字符串值,包括多行字符串;日期和数字作为类型化值排除 |
| INI | ini | 值(INI 无类型,因此看起来像数字的值也会作为字符串提取) |
| Environment | dotenv、env | 值(支持处理 export 前缀、引号和行内注释) |
| Python | python | 将三引号文档字符串作为一个字符串处理;支持 f 字符串和 r/b/u 前缀 |
| Rust | rust | 将原始字符串 r"…"、r#"…"#、r##"…"## 作为一个字符串处理,并保留其中的引号;支持字节字符串 |
| Go | go | 将反引号原始字符串作为一个字符串处理,支持跨行 |
| Shell | shellscript | 将 Here 文档(<<EOF、<<'EOF'、<<-EOF)作为一个字符串处理 |
| PHP、Ruby、Perl | php、ruby、perl | 将 Here 文档和 Now 文档(<<<EOT、<<<'NOW'、<<~EOS)作为一个字符串处理 |
| C# | csharp | 逐字字符串 @"…",其中 "" 表示一个引号;插值字符串 $"…" |
| JavaScript、TypeScript | javascript、typescript(以及 react ID) | 将模板字面量作为一个字符串处理,包括插值和嵌套内容 |
| Markdown 及其他格式 | markdown | 回退扫描单行中由 "双引号"、'单引号' 或 `反引号` 括起来的字符串 |
值会进行去首尾空白处理;空值会被丢弃;键永远不会被提取 — 上述所有提取器都遵循同一条规则。回退扫描无法识别未加引号的字符串,因此已解析格式和源语言都使用专门的读取器;启用 string-le.fallback.multiline(MCP 工具中的 multiline)后,它会读取跨行的带引号内容。除非启用 string-le.showParseErrors,否则解析错误不会显示。
扫描文件夹或工作区
Extract 会读取当前打开的文档。扫描会读取磁盘上的多个文件,并生成一份报告。
- 整个工作区:在命令面板中运行
String-LE: Extract Strings from Workspace。 - 单个文件夹:在资源管理器中右键单击该文件夹,然后选择
Extract Strings from Folder;或者运行String-LE: Extract Strings from Folder并选择一个文件夹。
项目中同一个字符串可能出现在很多地方,因此报告会列出不同的字符串,按使用范围从广到窄排序,并显示每个字符串出现的次数和位置。每个字符串都会列在表格中。大多数字符串只出现一次,这类字符串会显示在其所在行中。重复出现的字符串则会在下方单独列出一个部分,显示每个出现位置:
# String-LE workspace report
`my-project` · 4 file(s) read · 3 distinct string(s), 7 occurrence(s) in 3 file(s)
| String | Occurrences | Files | Where |
|---|---|---|---|
| `Save changes` | 4 | 3 | |
| `Cancel` | 2 | 2 | |
| `Press Enter` | 1 | 1 | `src/b.py` · **2:8** |
## `Save changes` (4)
- `i18n/en.json` · **2:11**
- `src/a.ts` · **1:11**, **3:11**
- `src/b.py` · **1:9**
## `Cancel` (2)
- `i18n/en.json` · **3:13**
- `src/a.ts` · **2:11**
## Could not be read (1)
- `bad.json`: Invalid JSON: Expected value after colon in object property on line 1 column 6
位置信息遵循 string-le.showPositions 设置。关闭此设置后,每行会显示文件名以及字符串在该文件中的出现次数:src/a.ts (2)。复制到剪贴板的内容遵循 string-le.clipboardIncludesPositions 设置,与 Extract 的行为相同。
如果文件格式读取器无法解析某个文件,报告会列出该文件及原因,不会跳过它。超过 120 个字符或包含换行符的字符串会显示为一行截断后的文本。比较时仍会使用完整字符串。
扫描会读取什么。 文件从磁盘读取,因此不会包含未保存的更改。超过安全大小限制的文件,或非 UTF-8 文本文件,不会被读取。扫描最多处理 5,000 个文件或 10,000 个列出的字符串出现位置。报告末尾会列出每项未处理的内容,以免将较短的报告误认为项目没有问题。
扫描会跳过什么,以及如何更改设置。 默认启用三个开关,可在 Settings 中分别关闭:
| 开关 | 跳过的内容 |
|---|---|
scanUseDefaultExcludes | 依赖项文件夹、构建输出、工具缓存和锁文件。完整列表见下文 |
scanRespectGitignore | 项目的 .gitignore 文件中排除的所有内容 |
scanSkipBinaryFiles | 图像、字体、归档文件和其他非文本文件 |
还有两个列表可以调整扫描结果,无需关闭开关。若要跳过更多内容,请在 scanExcludes 中添加模式。若要读取开关会跳过的内容,请将其添加到 scanAlwaysInclude:
{
// Also skip the test fixtures.
"string-le.workspace.scanExcludes": ["**/fixtures/**"],
// Read the vendored code, though the built-in list skips it.
"string-le.workspace.scanAlwaysInclude": ["**/vendor/**"]
}
String-LE: Open Settings 会在 Settings 编辑器中打开以上所有设置。
内置列表
文件夹(无论位于何处):
.git、.hg、.svn、node_modules、bower_components、jspm_packages、.pnpm-store、.yarn、vendor、site-packages、Pods、Carthage、dist、build、out、target、_build、_site、dist-newstyle、zig-out、storybook-static、cdk.out、DerivedData、CMakeFiles、.next、.nuxt、.output、.svelte-kit、.angular、.astro、.docusaurus、.vuepress、.expo、.turbo、.parcel-cache、.cache、.sass-cache、.jekyll-cache、.dart_tool、.pub-cache、.gradle、.kotlin、.cxx、.externalNativeBuild、captures、ephemeral、.symlinks、.swiftpm、.build、.bundle、.stack-work、.zig-cache、.godot、elm-stuff、.vercel、.netlify、.serverless、.aws-sam、.terraform、.venv、venv、__pycache__、.tox、.nox、.mypy_cache、.pytest_cache、.ruff_cache、.ipynb_checkpoints、.eggs、coverage、htmlcov、.nyc_output、.vscode-test、.idea、.vs、xcuserdata、*.egg-info
文件(无论位于何处):
*.min.js、*.min.css、*.map、*.snap、*.lock、package-lock.json、pnpm-lock.yaml、npm-shrinkwrap.json、go.sum、*.pbxproj、*.iml、local.properties、output-metadata.json、.flutter-plugins、.flutter-plugins-dependencies、.packages、Generated.xcconfig、flutter_export_environment.sh、GeneratedPluginRegistrant.*、fastlane/report.xml、fastlane/test_output/**、doc/api/**
未列入其中的文件夹(因为它们在许多项目中都是普通文件夹):bin、obj、tmp、logs、public、generated。如果项目会生成这些内容,通常会在 git 中忽略它们,而扫描会读取 .gitignore。
影响扫描的设置位于 Settings 下。
命令行工具
同样的提取功能也可在终端或 Shell 管道中运行:Rust 命令行工具位于 crate/,与扩展共用同一语料库 ——
crate/fixtures/ ——
因此两者读取文档的方式始终一致。可通过 npm 安装:npm install -g strings-le(或使用 npx strings-le 运行),也可通过 crates.io 安装:cargo install string-le。两种方式安装的是同一个命令,除了解析器用于拒绝损坏文档的措辞外,输出逐字节保持一致。
string-le . # every string in the tree; JSON on stdout when piped
string-le --values src/ # just the values, one per line
string-le --dedupe --values . # each distinct string once
string-le mcp # the same extraction over MCP on stdio
# the point of the whole thing:
string-le --values --dedupe src/ | sort > after.txt
diff before.txt after.txt # what changed in the copy this release
通过 npm (strings-le) 或 crates.io (string-le) 安装。 两种方式安装的都是同一个 string-le 命令。
npm install -g strings-le # or run it once: npx strings-le
cargo install string-le
读取者并非作者。 扩展针对你当前打开的缓冲区提供结果。发布前仍需有人阅读每一条面向用户的字符串 —— QA 负责人、合规审查人员、本地化负责人 —— 而他们并未打开编辑器,其中有些人甚至无法获得代码库副本。命令行工具会将整个代码库放入一个文件,供他们阅读。
源文件是这里的重点。 .ts 或 .py 文件是面向用户文案所在之处,因此每种语言都由其自身的字面语法来读取;任何仍未识别的内容都会转而进行带引号字符串提取,而不会被拒绝。
退出码遵循 grep —— 找到字符串时为 0,未找到时为 1,问题格式错误时为 2 —— 因此未找到内容也是一种答案,而非错误。
命令
| 命令 | 说明 |
|---|---|
String-LE: Extract Strings | 从当前文档提取所有字符串值 |
String-LE: Extract Strings from Workspace | 提取工作区每个文件中的不重复字符串,并标明每个字符串所在的位置 |
String-LE: Extract Strings from Folder | 对单个文件夹执行同样的操作。也可在资源管理器中的文件夹上执行 |
String-LE: Deduplicate Strings | 从当前文档中移除重复行 |
String-LE: Sort Strings | 按字母顺序或长度对行排序 |
String-LE: Toggle CSV Streaming | 为大型 CSV 文件启用/禁用流式处理 |
String-LE: Open Settings | 打开 String-LE 设置 |
String-LE: Help & Troubleshooting | 内置文档 |
默认情况下,没有命令绑定快捷键。你可以在编辑器的 Keyboard Shortcuts 中为任意命令设置快捷键。
设置
| 设置 | 默认值 | 描述 |
|---|---|---|
string-le.openResultsSideBySide | true | 在当前编辑器旁边打开结果 |
string-le.postProcess.openInNewFile | true | 后处理命令将结果写入新文件,而不是就地编辑 |
string-le.showPositions | false | 显示每个字符串所在的行和列 |
string-le.copyToClipboardEnabled | false | 同时将结果复制到剪贴板(CSV 输出时禁用) |
string-le.clipboardIncludesPositions | false | 复制内容中包含行和列 |
string-le.dedupeEnabled | false | 提取后自动对结果去重 |
string-le.sortEnabled | false | 提取后自动对结果排序 |
string-le.sortMode | off | alpha-asc、alpha-desc、length-asc、length-desc |
string-le.csv.streamingEnabled | false | 将 CSV 结果逐步写入编辑器 |
string-le.showParseErrors | false | 以通知形式显示解析错误 |
string-le.notificationsLevel | silent | all = 每条通知,important = 警告 + 错误,silent = 仅错误 |
string-le.workspace.scanPatterns | ["**/*"] | 文件夹或工作区扫描要读取的文件 |
string-le.workspace.scanUseDefaultExcludes | true | 跳过依赖项文件夹、构建输出、缓存和锁文件 |
string-le.workspace.scanRespectGitignore | true | 跳过项目的 .gitignore 文件所排除的内容 |
string-le.workspace.scanSkipBinaryFiles | true | 跳过图像、字体、存档文件及其他非文本文件 |
string-le.workspace.scanExcludes | [] | 要跳过的其他文件,以 glob 模式指定 |
string-le.workspace.scanAlwaysInclude | [] | 即使被上述三项设置之一排除,也要读取的文件 |
string-le.workspace.scanMaxFiles | 5000 | 单次扫描读取的最多文件数 |
string-le.workspace.scanMaxResults | 10000 | 停止读取前单次扫描列出的最多匹配项数 |
string-le.safety.enabled | true | 为超大文件和输出提供保护措施 |
string-le.safety.fileSizeWarnBytes | 1000000 | 提取的文件超过此大小时发出警告 |
string-le.safety.largeOutputLinesThreshold | 50000 | 结果数超过此值时提供“打开/复制/取消”选项 |
string-le.safety.manyDocumentsThreshold | 8 | 打开此数量的结果文档前进行确认(CSV 多列) |
string-le.statusBar.enabled | true | 显示状态栏项 |
string-le.telemetryEnabled | false | 仅限本地的事件日志(参见“隐私”) |
语言
除英语外,还支持十二种语言:
德语 · 西班牙语 · 法语 · 印度尼西亚语 · 意大利语 · 日语 · 韩语 · 葡萄牙语(巴西)· 俄语 · 乌克兰语 · 越南语 · 简体中文
涵盖了两部分内容:清单(命令标题、设置名称和描述),以及扩展运行时显示的所有内容(通知、状态栏、快速选择和提示词)。扩展会遵循 VS Code 的显示语言,因此会与编辑器当前设置的语言一致;无需单独设置。
隐私与安全
- 不访问网络。 此扩展绝不会向任何地方发送数据。
telemetryEnabled设置仅会将事件写入本地输出通道,供你检查(String-LE)。 - MCP 服务同样遵循这一原则。 它接收内容作为参数并返回数据:不访问文件系统、不发起网络调用、不收集遥测数据。你的 Agent 已有文件读取工具,因此在服务中重复实现这些功能,只会在没有增加能力的情况下引入路径遍历攻击面。若服务导入了任何可能访问上述任一项的内容,
check:mcp-bundle就会导致构建失败。 - 错误通知会隐藏用户主目录和类似凭据的片段。
- 最多提示评分两次。 第 3 次成功使用时,扩展会询问你是否愿意评分;如果你选择 稍后 或关闭提示,则会在第 20 次时再询问一次。选择 不再询问 后将不再提示。你自行将
notificationsLevel设为important或silent,也会关闭此功能。计数保存在 VS Code 的扩展存储中,不会向任何地方发送;点击 评分 会在浏览器中打开你安装时使用的列表页——VS Code Marketplace 或 Open VSX。
文档
| 内容 | 位置 |
|---|---|
| 此工具可以说什么——范围、输出约定、拒绝事项、非目标 | crate/SPEC.md |
| 扩展的构建与内部实现方式——架构、不变量、工具链、发布 | AGENTS.md |
| CLI 的构建与内部实现方式 | crate/AGENTS.md |
| 变更内容 | CHANGELOG.md · crate/CHANGELOG.md |
| 此工具的页面及另外 15 个工具 | letools.dev/tools/string-le |
性能
| 输入 | 大小 | 找到 | 耗时 | 速率 | 扫描速度 |
|---|---|---|---|---|---|
| JSON 本地化文件 | 1.77 MB | 40,000 | 9.53 ms | 4,198,116/秒 | 185.9 MB/s |
| YAML 本地化文件 | 1.01 MB | 30,000 | 13.33 ms | 2,250,169/秒 | 75.7 MB/s |
| CSV 字符串 | 1.35 MB | 80,002 | 28.29 ms | 2,827,438/秒 | 47.8 MB/s |
在 Apple M5 Pro、24 GB RAM、Node 24.3.0 上预热后运行 7 次所得的中位数。输入由 scripts/benchmark.ts 生成,而非纳入版本控制,因此上方大小与实际测量值完全一致。使用 bun run benchmark 复现。
这些数据因机器而异,不会在 CI 中作为断言——以基准测试结果决定是否允许构建,只能说明运行器当时有多忙。
测试
| 指标 | 覆盖率 |
|---|---|
| 语句 | 81.57% |
| 分支 | 72.80% |
| 函数 | 89.50% |
| 行 | 83.13% |
43 个文件中共有 525 个测试用例,另有一个在真实 VS Code 扩展宿主中运行的集成测试套件,以及一个将构建好的 .vsix 安装到干净配置中的端到端测试。
数据由 scripts/coverage-readme.js 从实际运行生成——来源为 coverage/coverage-summary.json 和 coverage/test-results.json;如果此部分内容发生偏差,CI 会失败。使用 bun run test:coverage 复现;用例数量以 vitest 打印的为准。
LE 系列的更多工具
为每个模型眼前的工作打造的 16 款单一用途工具。每款都附带一个 Rust CLI 和一个 MCP 服务。一页尽览:letools.dev
提取
- String-LE — 提取代码库中的所有字符串,方便人工阅读
- Numbers-LE — 提取代码库中所有硬编码数字,方便人工检查
- Units-LE — 提取所有带单位的数量并统一格式,遇到含义不明确的数量时会按名称拒绝处理
- Dates-LE — 提取所有日期和时间戳,并给出每个日期和时间戳解析出的确切时刻
- IDs-LE — 提取所有 UUID、ULID、NanoID、ObjectId 和 Snowflake,并解码其中的时间
- IPs-LE — 提取所有 IP 地址、CIDR 网段和 MAC 地址,统一格式并按范围分类
- URLs-LE — 提取代码库中的所有 URL,并给出协议和确切位置
- Paths-LE — 提取代码库中的所有文件路径,并说明它们是否仍指向实际内容
- Colors-LE — 提取代码库中的所有颜色,并指出哪些颜色不在你的调色板中
检查
- Regex-LE — 查找代码库中的所有正则表达式,并报告哪些可能导致灾难性回溯
- Versions-LE — 查找某个依赖项在仓库的各个清单文件中受到不同约束的位置
- i18n-LE — 识别项目使用的 i18n 库,然后依据该库的规则审查其目录
- Scrape-LE — 在编写抓取器之前检查网页能否抓取,并说明何时无法判断
防护
- Secrets-LE — 查找代码库中的硬编码凭据,绝不在报告中打印凭据
- EnvSync-LE — 比较目录树中的 dotenv 文件,并指出哪些文件缺少哪些键
- Unicode-LE — 查找那些隐藏含义的 Unicode 字符——双向控制字符、不可见字符、同形异义字符、混合文字系统
每款工具都独立运行:没有共享的 crate,也没有发布的核心库。若有两款工具得出相同结论,那是因为这个答案经得起两次验证。
联系 — nolindnaidoo.com · GitHub · LinkedIn
nolindnaidoo 的其他项目
Rust — pixelcoords 和 pixelactions 构成一个工作循环:pixelcoords 回答 位置,pixelactions 在那里执行操作。它们有各自的工具、各自的风格——不属于 LE 系列。
- pixelcoords — 冻结屏幕,标记区域,获取像素级精确的坐标和裁剪图像 pixelcoords.dev · crates.io · docs.rs
- pixelactions — 使用经过人工验证的坐标执行交互,并确认操作已生效 pixelactions.dev · crates.io · docs.rs
许可证
MIT © nolindnaidoo
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。