关于VsCode的搜索和替换-正则表达式

199 阅读2分钟

需求来源

最近一直在用kindle,但是书籍来源一般都是自己寻找。

而且kindle比较不讨人喜欢的一点是,对于TXT文件的支持性不太好,因此,不得已,只能手动转换成epub格式。

但是问题出现了,尝试了Calibre等各种工具,但是学习比较高,耗时也比较长,偶然发现一个好人提供的工具kaf-cli,好人一生平安。

这个大佬自己写了一个专门把txt文本转成epub电子书的命令行工具,亲测非常的好用。

但是,我们从各大书籍源下载的txt文件,章节名称千奇百怪,工具的通用章节匹配总是没法通用。

因此,需要自己手工的操作一下下~。

vsCode中的查找和替换

在自己手工操作的TXT的时候,会发现,将当前奇怪格式的章节名替换成常规的格式(第XXX章)时,可以很方便的使用vsCode的查找替换。

作为一个前端混子,之前写代码的时候,常用的就是输入一段代码或者文字,完美替换或者搜索,从没用过它的正则匹配功能。

需求才能产生生产力!

通过DeepSeek了解了一下,vsCode的搜索框使用正则表达式时,它使用的是JavaScript正则表达式的语法,这个大家肯定非常熟悉,但是另一个不常用的小特性是捕获组(Capturing Groups),它用于提取和操作匹配到的子字符串。在替换操作中,捕获组可以让你保留或修改特定的部分。

正则表达式--捕获组(DeepSeek答疑篇)

基本概念

  • 捕获组:通过在正则表达式中使用括号 () 来定义捕获组。每个捕获组会捕获匹配到的子字符串,并可以在替换模式中引用。
  • 引用捕获组:在替换模式中,使用 $1, $2, $3 等来引用第一个、第二个、第三个捕获组的内容。

扩展用法

1. 多个捕获组

你可以定义多个捕获组,并在替换模式中分别引用它们。

示例: 假设你有一个字符串列表,格式为 姓名: 张三, 年龄: 25,你想将其转换为 张三 (25岁)

  • 搜索模式

    姓名:\s*([\u4e00-\u9fa5]+),\s*年龄:\s*(\d+)
    

    解释:

    • 姓名:\s*([\u4e00-\u9fa5]+):匹配“姓名:”后跟一个或多个中文字符。
    • ,\s*年龄:\s*(\d+):匹配“,”后跟“年龄:”和一个或多个数字。
  • 替换模式

    $1 ($2岁)
    

    解释:

    • $1:引用第一个捕获组,即姓名。
    • $2:引用第二个捕获组,即年龄。

结果

姓名: 张三, 年龄: 25

转换为:

张三 (25岁)

2. 非捕获组

非捕获组用于分组但不捕获内容,使用 (?:...) 语法。

示例: 假设你有一个字符串 abc123def,你想匹配 abcdef 后跟数字,但不需要捕获 abcdef

  • 搜索模式

    (?:abc|def)(\d+)
    

    解释:

    • (?:abc|def):非捕获组,匹配 abcdef
    • (\d+):捕获组,匹配一个或多个数字。
  • 替换模式

    数字: $1
    

    解释:

    • $1:引用第一个捕获组,即数字。

结果

abc123def

转换为:

数字: 123

3. 命名捕获组

命名捕获组允许你为捕获组指定一个名称,使用 (?<name>...) 语法。

示例: 假设你有一个字符串 姓名: 张三, 年龄: 25,你想将其转换为 张三 (25岁)

  • 搜索模式

    姓名:\s*(?<name>[\u4e00-\u9fa5]+),\s*年龄:\s*(?<age>\d+)
    

    解释:

    • 姓名:\s*(?<name>[\u4e00-\u9fa5]+):匹配“姓名:”后跟一个或多个中文字符,并命名为 name
    • ,\s*年龄:\s*(?<age>\d+):匹配“,”后跟“年龄:”和一个或多个数字,并命名为 age
  • 替换模式

    ${name} (${age}岁)
    

    解释:

    • ${name}:引用名为 name 的捕获组。
    • ${age}:引用名为 age 的捕获组。

结果

姓名: 张三, 年龄: 25

转换为:

张三 (25岁)

4. 正向前瞻和正向后瞻

前瞻和后瞻用于匹配特定位置的内容,但不包含在匹配结果中。

  • 正向前瞻(?=...),匹配后面跟着特定模式的内容。
  • 正向后瞻(?<=...),匹配前面跟着特定模式的内容。

示例: 假设你有一个字符串 abc123def,你想匹配 abc 后跟数字,但不包含 abc

  • 搜索模式

    (?<=abc)\d+
    

    解释:

    • (?<=abc)\d+:匹配前面跟着 abc 的一个或多个数字。
  • 替换模式

    数字: $&
    

    解释:

    • $&:引用整个匹配的内容。

结果

abc123def

转换为:

abc数字: 123def

总结

捕获组在正则表达式中非常强大,可以用于提取、修改和替换字符串中的特定部分。通过使用多个捕获组、非捕获组、命名捕获组以及前瞻和后瞻,你可以更灵活地处理复杂的字符串操作。

感谢DeepSeek

平常这类比较冷门的小Tips,往往需要翻阅很多的垃圾水贴,才能够找到合适的一点点小建议。而DeepSeek很轻易的就能找到答案,感恩,ღ( ´・ᴗ・` )比心。

利用捕获组特性,在自行梳理替换TXT的章节名时就很方便了。