文本处理是日常开发和内容创作中最常见的需求之一。从统计文章字数到生成 SEO 友好的 URL,从转换命名风格到编辑 Markdown 文档,高效的文本处理工具能够大幅提升工作效率。本文将全面介绍 QubitTool 提供的六款文本处理工具,深入讲解其技术原理与最佳实践。

TL;DR

  • 文本分析器:统计字数、字符数、阅读时间,分析词频密度
  • 大小写转换器:支持 13 种命名风格转换,包括 camelCase、snake_case 等
  • Markdown 编辑器:实时预览、导出 HTML、支持完整语法
  • Slug 生成器:创建 SEO 友好的 URL 别名,支持中文拼音转换
  • 重复行删除器:快速去重,支持忽略大小写和排序
  • 数字转文字:将数字转换为英文单词,支持序数词和货币格式

文本分析器:深入理解你的文本

功能概述

文本分析器是内容创作者和开发者的必备工具,它能够即时分析文本的各项统计数据:

统计指标 说明
字符数 包含/不含空格两种统计
词数 智能识别中英文混合文本
句子数 基于句末标点识别
段落数 基于空行分隔识别
阅读时间 基于平均阅读速度计算
演讲时间 基于平均语速计算
词频分析 显示出现频率最高的词汇

阅读时间计算原理

阅读时间的计算需要考虑不同语言的阅读速度差异:

javascript
// 不同语言的阅读速度(词/分钟)
const readingSpeed = {
  chinese: 300,    // 中文:300字/分钟
  english: 200,    // 英文:200词/分钟
};

// 演讲速度(词/分钟)
const speakingSpeed = {
  chinese: 200,    // 中文:200字/分钟
  english: 150,    // 英文:150词/分钟
};

function calculateReadingTime(text) {
  const chineseChars = (text.match(/[\u4e00-\u9fa5]/g) || []).length;
  const englishWords = text
    .replace(/[\u4e00-\u9fa5]/g, ' ')
    .trim()
    .split(/\s+/)
    .filter(w => /[a-zA-Z]/.test(w)).length;
  
  const readingMinutes = Math.ceil(
    (chineseChars / readingSpeed.chinese) + 
    (englishWords / readingSpeed.english)
  );
  
  return readingMinutes;
}

词频分析算法

词频分析对于 SEO 优化和内容质量评估非常重要:

javascript
function analyzeWordFrequency(text) {
  const wordFreq = {};
  
  // 处理英文单词
  const englishWords = text
    .toLowerCase()
    .match(/[a-zA-Z]+/g) || [];
  
  englishWords.forEach(word => {
    wordFreq[word] = (wordFreq[word] || 0) + 1;
  });
  
  // 处理中文(二元组 + 单字)
  const chineseText = text.match(/[\u4e00-\u9fa5]+/g)?.join('') || '';
  
  // 二元组统计
  for (let i = 0; i < chineseText.length - 1; i++) {
    const bigram = chineseText.substring(i, i + 2);
    wordFreq[bigram] = (wordFreq[bigram] || 0) + 1;
  }
  
  // 单字统计
  chineseText.split('').forEach(char => {
    wordFreq[char] = (wordFreq[char] || 0) + 1;
  });
  
  // 返回频率最高的词汇
  return Object.entries(wordFreq)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 10);
}

关键词密度计算

关键词密度是 SEO 优化的重要指标,建议保持在 1%-3% 之间:

javascript
function calculateKeywordDensity(text, keyword) {
  const totalWords = text.split(/\s+/).length;
  const keywordCount = (text.match(new RegExp(keyword, 'gi')) || []).length;
  
  return ((keywordCount / totalWords) * 100).toFixed(2) + '%';
}

实际应用场景

  1. 内容创作:检查文章长度是否符合 SEO 要求(建议 1500+ 词)
  2. 演讲准备:根据演讲时间估算稿件长度
  3. 学术写作:确保论文符合字数要求
  4. 社交媒体:检查内容是否超出平台限制

大小写转换器:掌握命名规范

支持的转换类型

大小写转换器支持 13 种常见的命名风格转换:

类型 示例 常用场景
lowercase hello world 通用文本
UPPERCASE HELLO WORLD 常量、强调
Title Case Hello World 标题、专有名词
Sentence case Hello world 句子首字母
camelCase helloWorld JavaScript 变量
PascalCase HelloWorld 类名、组件名
snake_case hello_world Python、数据库
kebab-case hello-world URL、CSS 类名
CONSTANT_CASE HELLO_WORLD 常量定义
dot.case hello.world 配置项
path/case hello/world 文件路径
aLtErNaTe hElLo WoRlD 特殊效果
iNVERSE HELLO world 反转大小写

转换算法实现

javascript
const caseConverters = {
  // 驼峰命名:首字母小写,后续单词首字母大写
  camelCase: (text) => text
    .toLowerCase()
    .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())
    .replace(/^[A-Z]/, (c) => c.toLowerCase()),
  
  // 帕斯卡命名:所有单词首字母大写
  pascalCase: (text) => text
    .toLowerCase()
    .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())
    .replace(/^[a-z]/, (c) => c.toUpperCase()),
  
  // 蛇形命名:小写字母,下划线分隔
  snakeCase: (text) => text
    .replace(/([a-z])([A-Z])/g, '$1_$2')
    .replace(/[\s-]+/g, '_')
    .toLowerCase(),
  
  // 短横线命名:小写字母,短横线分隔
  kebabCase: (text) => text
    .replace(/([a-z])([A-Z])/g, '$1-$2')
    .replace(/[\s_]+/g, '-')
    .toLowerCase(),
  
  // 常量命名:大写字母,下划线分隔
  constantCase: (text) => text
    .replace(/([a-z])([A-Z])/g, '$1_$2')
    .replace(/[\s-]+/g, '_')
    .toUpperCase(),
  
  // 标题格式:每个单词首字母大写
  titleCase: (text) => text
    .replace(/\w\S*/g, (txt) =>
      txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()
    ),
  
  // 句子格式:句首字母大写
  sentenceCase: (text) => text
    .toLowerCase()
    .replace(/(^\s*\w|[.!?]\s*\w)/g, (c) => c.toUpperCase()),
};

编程语言命名规范

不同编程语言有不同的命名习惯:

语言 变量 常量 类/组件 函数
JavaScript camelCase CONSTANT_CASE PascalCase camelCase
Python snake_case CONSTANT_CASE PascalCase snake_case
Java camelCase CONSTANT_CASE PascalCase camelCase
Go camelCase PascalCase PascalCase camelCase
Rust snake_case CONSTANT_CASE PascalCase snake_case
CSS kebab-case - - -

最佳实践

  1. 保持一致性:项目内使用统一的命名风格
  2. 语义化命名:名称应该清晰表达用途
  3. 避免缩写:除非是广泛认可的缩写
  4. 遵循框架规范:如 React 组件使用 PascalCase

Markdown 编辑器:高效文档编写

功能特性

Markdown 编辑器提供专业的 Markdown 编辑体验:

  • 实时预览:边写边看,所见即所得
  • 多种视图模式:纯编辑、分屏、纯预览
  • 导出功能:下载 .md 文件或导出完整 HTML
  • 语法高亮:代码块自动高亮
  • 统计信息:实时显示字数、字符数、行数

Markdown 核心语法

标题

markdown
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

文本格式

markdown
**粗体文本**
*斜体文本*
~~删除线~~
`行内代码`

列表

markdown
无序列表:
- 项目一
- 项目二
  - 子项目

有序列表:
1. 第一步
2. 第二步
3. 第三步

链接和图片

markdown
[链接文本](https://example.com)
![图片描述](image.png)

代码块

markdown
```javascript
function hello() {
  console.log('Hello, World!');
}
```

表格

markdown
| 列1 | 列2 | 列3 |
|-----|-----|-----|
| A1  | B1  | C1  |
| A2  | B2  | C2  |

引用

markdown
> 这是一段引用文本
> 可以跨越多行

Markdown 渲染原理

Markdown 到 HTML 的转换基于解析器实现:

javascript
import MarkdownIt from 'markdown-it';

const md = new MarkdownIt({
  html: true,        // 允许 HTML 标签
  linkify: true,     // 自动识别链接
  typographer: true, // 智能引号
  breaks: true,      // 换行转 <br>
});

const html = md.render(markdownText);

高级技巧

  1. 任务列表

    markdown
    - [x] 已完成任务
    - [ ] 待完成任务
    
  2. 脚注

    markdown
    这是一个脚注[^1]
    [^1]: 脚注内容
    
  3. 数学公式(需要扩展支持):

    markdown
    行内公式:$E = mc^2$
    块级公式:$$\sum_{i=1}^n a_i$$
    

Slug 生成器:SEO 友好的 URL

什么是 Slug?

Slug 是 URL 中用于标识页面的人类可读部分。例如:

code
https://example.com/blog/my-first-blog-post
                        ↑
                    这就是 Slug

为什么 Slug 对 SEO 重要?

  1. 搜索引擎理解:描述性 URL 帮助搜索引擎理解页面内容
  2. 用户体验:用户可以从 URL 预判页面内容
  3. 分享友好:简洁的 URL 更易于分享和记忆
  4. 点击率提升:搜索结果中显示的 URL 影响点击决策

Slug 生成规则

Slug 生成器遵循以下规则:

javascript
function generateSlug(text, options) {
  let slug = text;
  
  // 1. 去除首尾空白
  if (options.trimWhitespace) {
    slug = slug.trim();
  }
  
  // 2. 音译转换(处理特殊字符和中文)
  if (options.transliterate) {
    // 处理带重音的字符
    slug = slug.replace(/[àáâãäå]/g, 'a')
               .replace(/[èéêë]/g, 'e')
               .replace(/[ìíîï]/g, 'i')
               .replace(/[òóôõö]/g, 'o')
               .replace(/[ùúûü]/g, 'u')
               .replace(/[ñ]/g, 'n')
               .replace(/[ç]/g, 'c');
    
    // 处理中文(转拼音)
    if (/[\u4e00-\u9fa5]/.test(slug)) {
      slug = slug.replace(/[\u4e00-\u9fa5]+/g, (match) => {
        return ' ' + pinyin(match, { toneType: 'none' }).join(' ') + ' ';
      });
    }
  }
  
  // 3. 移除数字(可选)
  if (options.removeNumbers) {
    slug = slug.replace(/[0-9]/g, '');
  }
  
  // 4. 移除特殊字符
  slug = slug.replace(/[^\w\s-]/g, '');
  
  // 5. 替换空白为分隔符
  slug = slug.replace(/[\s_]+/g, options.separator);
  
  // 6. 移除连续分隔符
  slug = slug.replace(new RegExp(`${options.separator}+`, 'g'), options.separator);
  
  // 7. 移除首尾分隔符
  slug = slug.replace(new RegExp(`^${options.separator}|${options.separator}$`, 'g'), '');
  
  // 8. 转小写
  if (options.lowercase) {
    slug = slug.toLowerCase();
  }
  
  // 9. 限制长度
  if (options.maxLength > 0 && slug.length > options.maxLength) {
    slug = slug.substring(0, options.maxLength);
    // 在单词边界截断
    const lastSep = slug.lastIndexOf(options.separator);
    if (lastSep > options.maxLength * 0.5) {
      slug = slug.substring(0, lastSep);
    }
  }
  
  return slug;
}

Slug 最佳实践

实践 好的示例 不好的示例
使用短横线分隔 my-blog-post my_blog_post
保持简短 seo-guide the-complete-guide-to-seo-optimization-2024
包含关键词 react-hooks-tutorial post-12345
全部小写 javascript-tips JavaScript-Tips
避免停用词 python-guide a-guide-to-python

中文 Slug 处理

对于中文内容,有两种常见策略:

  1. 拼音转换你好世界ni-hao-shi-jie
  2. 保留中文你好世界你好世界(需要 URL 编码)

推荐使用拼音转换,因为:

  • 兼容性更好
  • URL 更短
  • 便于手动输入

重复行删除器:高效文本去重

应用场景

重复行删除器适用于多种场景:

  • 清理邮件列表
  • 去除重复的 URL
  • 整理数据文件
  • 合并配置项

去重算法

javascript
function removeDuplicates(text, options) {
  let lines = text.split('\n');
  
  // 去除空白
  if (options.trimWhitespace) {
    lines = lines.map(line => line.trim());
  }
  
  // 忽略空行
  if (options.ignoreEmptyLines) {
    lines = lines.filter(line => line.length > 0);
  }
  
  // 使用 Set 去重
  const seen = new Set();
  const uniqueLines = [];
  
  for (const line of lines) {
    // 根据选项决定比较键
    const key = options.ignoreCase ? line.toLowerCase() : line;
    
    if (!seen.has(key)) {
      seen.add(key);
      uniqueLines.push(line);
    }
  }
  
  // 排序(可选)
  if (options.sortOutput === 'asc') {
    uniqueLines.sort((a, b) => a.localeCompare(b));
  } else if (options.sortOutput === 'desc') {
    uniqueLines.sort((a, b) => b.localeCompare(a));
  }
  
  return uniqueLines.join('\n');
}

查找重复项

除了删除重复,还可以找出哪些行是重复的:

javascript
function findDuplicates(text, options) {
  let lines = text.split('\n');
  
  if (options.trimWhitespace) {
    lines = lines.map(line => line.trim());
  }
  
  if (options.ignoreEmptyLines) {
    lines = lines.filter(line => line.length > 0);
  }
  
  // 统计每行出现次数
  const count = {};
  for (const line of lines) {
    const key = options.ignoreCase ? line.toLowerCase() : line;
    count[key] = (count[key] || 0) + 1;
  }
  
  // 筛选出现多次的行
  const duplicates = Object.entries(count)
    .filter(([_, c]) => c > 1)
    .map(([line, c]) => `${line} (${c}x)`);
  
  return duplicates.join('\n');
}

配置选项说明

选项 说明 示例
忽略大小写 Apple 和 apple 视为相同 启用后只保留首次出现
去除空白 比较前移除首尾空格 " hello " = "hello"
忽略空行 不处理空白行 空行不计入统计
排序输出 按字母顺序排列结果 A-Z 或 Z-A

数字转文字:专业的数字表达

功能介绍

数字转文字工具将数字转换为英文单词表达,支持三种模式:

  1. 标准模式1234one thousand two hundred thirty-four
  2. 序数词模式1first2second3third
  3. 货币模式99.99ninety-nine dollars and ninety-nine cents

转换算法

javascript
const ones = ['', 'one', 'two', 'three', 'four', 'five', 
              'six', 'seven', 'eight', 'nine'];
const teens = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen',
               'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
const tens = ['', '', 'twenty', 'thirty', 'forty', 
              'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
const scales = ['', 'thousand', 'million', 'billion', 'trillion'];

function numberToWords(num) {
  if (num === 0) return 'zero';
  
  const isNegative = num < 0;
  num = Math.abs(num);
  
  let words = [];
  let scaleIndex = 0;
  
  while (num > 0) {
    const chunk = num % 1000;
    
    if (chunk > 0) {
      const chunkWords = convertChunk(chunk);
      if (scales[scaleIndex]) {
        words.unshift(chunkWords + ' ' + scales[scaleIndex]);
      } else {
        words.unshift(chunkWords);
      }
    }
    
    num = Math.floor(num / 1000);
    scaleIndex++;
  }
  
  return (isNegative ? 'minus ' : '') + words.join(' ');
}

function convertChunk(num) {
  let words = [];
  
  if (num >= 100) {
    words.push(ones[Math.floor(num / 100)] + ' hundred');
    num %= 100;
  }
  
  if (num >= 20) {
    words.push(tens[Math.floor(num / 10)]);
    num %= 10;
  }
  
  if (num >= 10) {
    words.push(teens[num - 10]);
  } else if (num > 0) {
    words.push(ones[num]);
  }
  
  return words.join(' ');
}

货币转换

javascript
function numberToCurrency(num, currency = 'USD') {
  const currencyConfig = {
    USD: { main: 'dollar', sub: 'cent' },
    EUR: { main: 'euro', sub: 'cent' },
    GBP: { main: 'pound', sub: 'pence' },
    CNY: { main: 'yuan', sub: 'fen' },
  };
  
  const config = currencyConfig[currency];
  const dollars = Math.floor(num);
  const cents = Math.round((num - dollars) * 100);
  
  let result = '';
  
  if (dollars > 0) {
    result = numberToWords(dollars) + ' ' + 
             config.main + (dollars !== 1 ? 's' : '');
  }
  
  if (cents > 0) {
    if (result) result += ' and ';
    result += numberToWords(cents) + ' ' + 
              config.sub + (cents !== 1 ? 's' : '');
  }
  
  return result || 'zero ' + config.main + 's';
}

应用场景

  1. 支票填写:金额必须同时用数字和文字表示
  2. 法律文件:合同金额需要文字确认
  3. 教育用途:学习数字的英文表达
  4. 语音合成:将数字转换为可朗读的文本

常见问题解答

文本分析相关

Q: 阅读时间计算准确吗?

A: 阅读时间基于平均阅读速度计算(中文 300 字/分钟,英文 200 词/分钟)。实际阅读时间因人而异,此数值仅供参考。

Q: 词频分析支持中文吗?

A: 支持。中文采用二元组(两个连续汉字)和单字统计相结合的方式,能够较好地反映词汇使用频率。

命名转换相关

Q: camelCase 和 PascalCase 有什么区别?

A: camelCase 首字母小写(如 myVariable),PascalCase 首字母大写(如 MyClass)。前者常用于变量和函数,后者常用于类和组件。

Q: 什么时候使用 snake_case?

A: snake_case 主要用于 Python 变量和函数、数据库字段名、配置文件键名等场景。

Slug 生成相关

Q: Slug 中应该使用短横线还是下划线?

A: 推荐使用短横线(-)。Google 将短横线视为单词分隔符,而下划线会被视为单词的一部分。

Q: Slug 最佳长度是多少?

A: 建议控制在 50-60 个字符以内,包含 3-5 个关键词。过长的 Slug 会被搜索引擎截断。

Markdown 相关

Q: Markdown 编辑器支持哪些语法?

A: 支持所有标准 Markdown 语法,包括标题、列表、链接、图片、代码块、表格、引用等。

Q: 可以导出为其他格式吗?

A: 目前支持导出为 .md 文件和完整的 HTML 文档(包含样式)。

总结

文本处理是开发和内容创作的基础工作,选择合适的工具能够显著提升效率:

工具 核心功能 适用场景
文本分析器 统计、词频、阅读时间 内容创作、SEO 优化
大小写转换器 13 种命名风格转换 代码重构、格式统一
Markdown 编辑器 实时预览、导出 文档编写、博客创作
Slug 生成器 SEO 友好 URL 网站开发、内容发布
重复行删除器 去重、排序 数据清洗、列表整理
数字转文字 数字英文转换 支票、法律文件

所有工具都在浏览器本地运行,数据不会上传到服务器,确保您的内容安全和隐私。

相关资源