需求来源
最近一直在用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,你想匹配 abc 或 def 后跟数字,但不需要捕获 abc 或 def。
-
搜索模式:
(?:abc|def)(\d+)解释:
(?:abc|def):非捕获组,匹配abc或def。(\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的章节名时就很方便了。