MENU

关于我那误打误撞学会的正则

March 18, 2020 • 代码

是这样的

一个朋友喜欢看书,尤其是轻小说。以前在轻文轻小说看妹系的国轻。可惜..

iqing

但是有一本之前在轻文的妹系小说他久久无法忘怀,于是历经千辛万苦终于找到了TXT文件。我那个朋友十分注重阅读体验,所以用上了「厚墨」这款阅读器。这本是件好事,因为厚墨确实非常舒服。但是呢,厚墨导入小说的时候要使用正则表达式匹配小说标题。

虽然厚墨自带了一个正则匹配表达式,但是完全没起作用。我朋友作为一个完美主义者,完全接受不了这种奇奇怪怪的目录。所以他便找上了我。

我也是厚墨的用户之一,以前看的书一般用厚墨自带的也可以完美使用了,这到底是何方神圣。怀着这样的心情我打开了小说TXT。第一章第一节的标题是

vol.① 妹妹变得奇怪这件事情绝对没办法接受 chapter 1 这和我的妹妹不一样

这明显完全超出了厚墨自带正则的接受范围@(huaji_han),没办法只能自己动手了。不对,我明明也不会啊@(huaji_shang)

..

没办法只能硬着头皮边学边搞了。

开始

中午睡前在表哥那里学了半个钟,我的眼睛告诉我我学会了。下午赶紧找个课间试试手。

分析

第一步先分析一下这种标题的组成,看了一下前几章的标题

vol.① 妹妹变得奇怪这件事情绝对没办法接受 chapter 1 这和我的妹妹不一样
vol.① 妹妹变得奇怪这件事情绝对没办法接受 chapter 2 这个展开和我想的不一样
vol.① 妹妹变得奇怪这件事情绝对没办法接受 chapter 3 这件事情比我想象的要复杂
vol.① 妹妹变得奇怪这件事情绝对没办法接受 chapter 4 这就是我的妹妹吧

大概是vol.+符号序号(①)+卷名+chapter+章节序号(1,2,3...)+标题,然后从符号序号开始每个成分之间还要加个空格。了解了组成之后就可以动手了。第一稿,启动!

编写

vol.[①②③④⑤⑥⑦⑧⑨⑩]\s[\u4e00-\u9fa5]+\schapter\s[0-9]+\s[\u4e00-\u9fa5]+

解析一下:

vol.是写死的,不用改所以直接写上去了。然后是卷的符号序号,用一个集合[]把所有可能包起来。空格则是用\s来匹配。接下来是一段章节名,直接上中文匹配[\u4e00-\u9fa5],因为文章标题不可能只有一个字,所以加上个+表示一个或多个。之后的就按部就班地写就完事了。

试试看。

...
vol.① 妹妹变得奇怪这件事情绝对没办法接受 chapter 34 这个任务果然是失败了
vol.① 妹妹变得奇怪这件事情绝对没办法接受 chapter 35 这个礼物算是最后的方法吧
vol.④ 逐渐重叠的麻烦和心意 chapter 1 林静这是闹哪样
vol.④ 逐渐重叠的麻烦和心意 chapter 2 证明自己是个妹控
vol.④ 逐渐重叠的麻烦和心意 chapter 3 姐妹
...
vol.④ 逐渐重叠的麻烦和心意 chapter 47 被耍了
vol.④ 逐渐重叠的麻烦和心意 chapter 48 想要保护她的心意
vol.⑥ 将恐惧击碎的勇气来自羁绊 chapter 2 第一日
vol.⑥ 将恐惧击碎的勇气来自羁绊 chapter 3 第一日
...
vol.⑥ 将恐惧击碎的勇气来自羁绊 chapter 74 决断
vol.⑥ 将恐惧击碎的勇气来自羁绊 chapter 75 决断

前面都还好,不过第二三五七八卷跑到哪里去了??书本身是有到vol.⑧的,莫非中间出了什么猫腻?先看看第二第三卷啥情况。再次打开TXT文档找到出问题的章节。

vol.② 日常的转折点:TG! chapter 1 关于我有点健忘这件事……
vol.③ TG带来的乱七八糟的生活 chapter 2 新的开始和新的麻烦
vol.⑤已经无法抑制的心跳 chapter 1 海边的别墅
vol.⑦ 新生活,新动乱 chapter 1 渐回正轨的日常?【1】
vol.⑧:珍贵必用真心 chapter 2 国王游戏[2]

WTF!?卷名中间出现了中文标点和英文。第五卷中序号和卷名之间没有空格,第八卷则是用“:”代替了那个空格。@(yinxian)@(yinxian)@(yinxian)

只能动手修改了。

符号序号和卷名中间有可能出现的是

  • 空格
  • “:”
  • 啥都没有

而且只会出现一个。那么就用*来解决吧。*在正则里表示出现0个及以上。这里这段正则就可以写成

[\s]*[:]*

然后是卷名中间的英文和符号问题。

会出现的情况有三种:

  • 中文++英文+
  • 英文+中文
  • 中文++中文

因为学术不精,那只能就使用笨方法了。

[A-Z]*[\u4e00-\u9fa5]+[,]*[:]*[A-Z]*[!]*[\u4e00-\u9fa5]*

那么第二稿表达式就是

vol.[①②③④⑤⑥⑦⑧⑨⑩][\s]*[:]*[A-Z]*[\u4e00-\u9fa5]+[,]*[:]*[A-Z]*[!]*[\u4e00-\u9fa5]*\schapter\s[0-9]+\s[\u4e00-\u9fa5]+

再试试。NICE,一个不漏!然而问题还没结束。

vol.⑦ 新生活,新动乱 chapter 35 自己的想法
vol.⑦ 新生活,新动乱 chapter 36 自己的想法
vol.⑦ 新生活,新动乱 chapter 38 自己的想法

为什么会出现重复的??(37不见了是小说TXT本身就没有)马上赶到出事地点。

 vol.⑦ 新生活,新动乱 chapter 38 自己的想法【4】

啊,这也是常见的标题起法呢@(chaiquanku)。所以只用在后面再加上

[【]*[0-9]*[】]*

那么最终表达式就是:

vol.[①②③④⑤⑥⑦⑧⑨⑩][\s]*[:]*[A-Z]*[\u4e00-\u9fa5]+[,]*[:]*[A-Z]*[!]*[\u4e00-\u9fa5]*\schapter\s[0-9]+\s[\u4e00-\u9fa5]+[【]*[0-9]*[】]*

..

完美!

写在后面

这次一共耗时两个课间加午睡前半个小时,但是感觉收益颇丰。就是下午放学后累瘫了。一个下午都没有休息一下有点缓不过来。也算是次不错的体验吧。

我感觉我正则已经入门了!

Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment

45 Comments
  1. 一招(.*?)走天下 @(huaji_pc)

    1. @冯小贤妙啊 @(huaji_shang)

  2. 我是误打误撞学会了设计,成了网页设计,成了UI设计,又成了产品设计。。。。

    1. @米石文创误打误撞一条龙hhh

  3. 文章不错非常喜欢

  4. Yue Yue

    不愧是被誉为“火星文”的正则 @(huaji_pc)

  5. @(huaji_han) 正则一时爽,修改火葬场