Sigil制作epub,正则表达式的使用

原文链接Sigil正则表达式入门
以前经常在txt文档,特别是下载的小说中看到很多&gt &lt。突然发现原来是html中的转义字符惹的祸
HTML转义字符对照表

最常见的html转义字符

Sigil是一个不错的epub制作软件,适合入门用户。Sigil最值得称道的地方就是,允许我们使用正则表达式,大大方便了我们处理文本的过程。

正则表达式,是一种用特殊符号表示文字的方法,主要用在查找和替换方面。

在一个文本中,有这样的一些内容:
序章
第一章 ABCDEF
第二章 GHIJKL
第三章 …………
终章
复制代码
这种内容我们都很熟悉,你有没有想过,用什么办法可以把这些内容一次过查找出来呢?

为了简化,我们先来看这个部分。
第一章
第二章
第三章
可以看到,这些内容有着极高的相似性,由“第”,“章”开头和结尾,中间有着一些数字。如果我们能用一个什么符号来代表中间的所有字,比如一个圆点“.”,不就可以用这样的方式来查找出所有这样的内容了吗。
“第.章”
很早之前,就有人发明了一套完整的方案,让我们可以用各种不同的符号来达到这种目的,那就是我们将要了解的正则表达式。

正则表达式作为一种描述字符的方案,在大量软件、编程语言中都有所运用,而在这些不同的平台上,正则表达式的使用方式又往往会有或多或少的差异,在某个平台上管用的表达式,换个地方可能就要改改才能正确运行。那么在这篇文章里,我们主要是讲Sigil中的正则表达式,至于推广应用,就要靠大家去查找资料了。

我们前面提到,正则表达式一个重要作用就是用特别的符号来代表一类字符,而这些符号就叫做“元字符”。这些元字符在大多数环境下都是通用的。

注意,元字符中所有符号都是半角符号,也就是通常说的英文符号。

以下是一些常见的元字符,实际上还有更多。这些元字符都经过测试,在Sigil下有效。(后来我自己又加入了部分Sublime Text的可用正则表达式写法)

符号意义说明
.任意一个字符最简单的元字符,匹配任意字符,但不包括换行符“\n”
\转义把元字符改变为普通字符。比如,“\.”就是代表普通的点号,不代表其他字符
\s空白字符表示半角空格、制表符、换行符等空白字符的其中一个。在Sigil中使用注意,不能匹配到全角空格(在Sublime Text好像可以匹配到全角空格)
\S非空白字符匹配除了半角空格、制表符、换行符等空白字符以外的一个字符
\t制表符匹配制表符
\n换行符表示文章的换行,这是一个不可见符号,在例子中,这个符号在“_”的位置。
例如:
aaa\n
bbb
你能够通过“\n”找到换行符,但不能够插入换行符。要在替换结果中换行,需要用“\r”。
\r回车符代表一个回车符。这个符号不会在文本中出现,因此不能查找到。但是如果你需要在查找结果中插入一个换行,那么就要用“\r”。
注意,插入后在文本中出现的仍然会是“\n”而不是“\r”。
\b匹配字词边界 
\d任意一个阿拉伯数字也就是可以代表0~9中的任意一个。
\D任意一个非阿拉伯数字0~9以外的一个字符,同样的,不包括换行符“\n”
^行首

即一行的开头。Sigil中不能单独使用,要配合其他字符。
比如:
abc

 abc
abcd
“^a”表示在行首的“a”,能匹配到第一行和第三行的字母“a”。第二行因为行首是空格,因此匹配不到。

$行尾

表示任意一行的结尾,不包括换行符。在Sigil中不能单独使用。

比如:
abc
 abc
abcd
“c$”表示位于行尾的“c”,能够匹配到第一行和第二行的字母“c”。

|一个逻辑选择符。“aa|bb”既可以匹配到“aa”也可以匹配到“bb”。其他,“gr([a-z]|[A-Z])y”可以匹配到“grdy”或 “grTy”。还可以用到多个选项中,比如“aa|bb|cc”。“1|2|3”相当于“[123]”。
+匹配前一项内容 1 或多次必须配用其他字符使用。添加在一个字符后面,表示匹配1个或更多个该字符。
相当于“{1,}”。
比如,“sa+”表示一个以上的“a”,以下例子都能匹配到。
sa
saa
saaa
+?匹配前一项内容 0 或多次 (最少匹配)

必须配用其他字符使用。添加在一个字符后面,表示匹配1个或更多个该字符(最少匹配)。
比如:

ssrTgfkjkdhurst

"s.+?r"可以匹配到"ssr",而"s.+r"可以匹配到"ssrTgfkjkdhur"

(在Sublime Text测试可用)

?匹配前一项内容 0 或 1 次

必须配用其他字符使用。添加在一个字符后面,表示匹配该字符0或1次。

比如:

srtjkls

"sr?"可以匹配到"srtjkls"中的"sr"以及行尾的"s",相当于"sr|s"。

(在Sublime Text测试可用)

*匹配前一项内容 0 或多次,即无或更多。

必须配用其他字符使用。添加在一个字符后面,表示匹配0个或多个该字符。相当于“{0,}”。

比如,“sa*”表示0个以上的“a”,以下例子都能匹配到。

s
sa
saa
saaa

*?匹配前一项内容 0 或多次 (最少匹配)

必须配用其他字符使用。添加在一个字符后面,表示匹配0个或多个该字符(最少匹配)。

比如:

ssrTgfkjkdhurst

"s.*?r"可以匹配到"ssr",而"s.*r"可以匹配到"ssrTgfkjkdhur"

"*?"与"+?"的区别,暂时没想到例子,一般都使用"+?"

(在Sublime Text测试可用)

{n,m}匹配前一项内容的个数范围

必须配用其他字符使用。添加在一个字符后面,表示匹配该字符的个数范围。

比如,“a{3}”表示“aaa”,“a{2,4}”表示“aa”或“aaa”或“aaaa”,“a{1,}”表示一个以上的“a”。
注意,“a{,2}”应该表示两个以下的“a”,但是这种写法在Sigil中无效,要写成“a{0,2}”。

[]匹配其中的一个字符

注意:“[]”只匹配一个字符。“[]”是不分顺序的,“[abc]”和“[bca]”一样。

比如,“[abc]”匹配“a”、“b”或“c”中的一个。
“[]”中用“-”表示范围,“[a-z]”表示能匹配到“a”到“z”全部26个字母之一。比如,“[0-9]”和“\d”是一样的,但是“\d”速度更快。

如果大小写敏感,使用"[a-zA-Z]"能匹配到“a”到“z”和“A”到“Z”全部26个字母之一。
如果要在“[]”中匹配“-”本身,把“-”写在最前面,或者把它转义“\-”。
比如,“[-0-9]”就能匹配所有阿拉伯数字和“-”。

[^]匹配除了[^]内字符以外的一个其他字符

注意:“[^]”只匹配一个字符。注意,因为“[^]”中符号是无序的,因此如果要排除字符串,要用其他方法。

比如:
abc
adc
affc

“a[^b]c”能匹配到第二行,不能匹配第一行、第三行。"[^abc]" 表示匹配任意不包括 a, b, c的一个字符。

 

()捕获组“(abc)”表示把“abc”分为一组。分组后可以配合其他元字符使用。一个组称为一个捕获组。
比如,“(abc)+”就是一个或以上“abc”组合的意思。
捕获组中的内容会被记录并编号,可以通过“\0”、“\1”这种形式来引用。
(?: )分组/非捕获组作用上与“()”类似,能把内容分为一组,但"(?: )"仅有分组功能,不记录匹配内容。也就是说,无法通过“\0”“\1”等方式引用。
此元字符虽然消耗的资源更少,速度更快,在简单应用中可能体验不到与“()”的区别。
\0,\1,\2…反向引用配合"()"使用,引用一个分组。
比如,在查找时有分组“(abc)”,那么“\1”就代表“abc”。有分组“a(bc)(de)f”,那么“\0”代表“abcdef”,“\1”代表“bc”,“\2”代表“de”。如此类推。
嵌套也是一样的,比如“(abc(def))”,“\1”代表“abcdef”,“\2”代表“def”。
同样地,\0,\1,\2…也能在查找时应用。
比如有字符串“abc111abc”,那么表达式“(abc).*\1”就能匹配到所有内容。
注:在其他平台中,可能使用的是$0,$1等表示反向引用。
(?s)多行匹配放在表达式的最前端,使得“.”可以匹配到“\n”,从而实现跨行匹配。
比如以下例子:
<div></div>
  <h1></h1>
<div>sdree</div>
使用正则表达式“<div>.*</div>”一次只能匹配到第一行或者第三行。
而使用“(?s)<div>.*</div>”则能一次性匹配到第一行到第三行所有内容。
注:这是Sigil特有元字符,其他平台有另外的方法实现该功能。
注2:此前缀和勾选“DotAll”效果一致。
(?U)最少匹配放在表达式的最前端,使得整个正则表达式实现最少匹配。
比如以下例子:
<div>AAA<div>BBB</div>CCC</div>
正则表达式“<div>.*</div>”会匹配到整个句子。
而“(?U)<div>.*</div>”只会匹配到“<div>AAA<div>BBB</div>”。
注:这是Sigil特有元字符,其他平台有另外的方法实现该功能。
注2:此前缀和勾选“Minimal Match”效果一致。
常用正则表达式
.*匹配所有内容(注意:“.”不能匹配到“\n”)

“.”代表一个字符,“*”代表前一个字符0或多个,因此“.*”代表“所有字符”。
比如:<div>.*</div>
表示<div></div>标签内的所有内容,可以依次匹配到下列各项
<div>AAACCCC</div>
<div></div>
<div>!!!!AAAAACCCC啊啊啊啊</div>

但不能跨行,这样是匹配不到的下面的例子的:
<div>
AAAAAA
</div>
如果要匹配到跨行,需要使用“(?s)”。写成(?s)<div>.*</div>

^[ \t ]*$\n匹配空白行匹配空白行的典型写法。可以匹配无内容的行,只有空格的行,只有制表符的行或者空格和制表符混合排列的行。[]中包括的分别是半角空格“ ”,制表符“\t”和全角空格“ ”。也可以根据需要添加更多的字符。
[ \t ]+$行尾空白字符匹配出现在行尾的空白字符,比如空格。思路和【匹配空白行】一致,使用“$”把搜查范围限定在结尾,使用了符号“+”确保最少有一个空白字符,否则会查找失败。

查找"。+"

替换"。"

压缩重复符号很容易理解,把一个以上的“。”,换成一个“。”,从而达到压缩重复符号的目的。可以灵活改变,压缩各种重复的字符。配合查找【空白行】,也能实现压缩空白行。
[A-Za-z]匹配任意一个英文字母

也可以写成[a-zA-Z],a-z和A-Z顺序无关;[a-zA-Z0-9]则表示:匹配英文和数字当中的任意一个字符

[a-z]表示:匹配从 a 到 z 之间的任意一个字符

[^A-Za-z]匹配任意一个非英文字母的字符[^A-Za-z0-9]则表示:匹配任意一个非英文字母和数字的字符
[\u4E00-\u9FA5]匹配任意一个汉字

注意:[\u4e00-\u9fa5]这种匹配汉字写法不算全面,不包含一些生僻汉字。详情参照https://blog.csdn.net/weixin_30780649/article/details/98327208

例外:在SublimeText的正则表达式使用中,[\u4E00-\u9FA5]可以匹配到英文字母、数字以及部分英文标点符号,需要写成[\x{4e00}-\x{9fa5}],才能只匹配到汉字

[\x{ff41}-\x{ff5a}\x{ff21}-\x{ff3a}]匹配任意一个全角英文字母

如果要匹配全角英文字母和全角数字,写成[\x{ff41}-\x{ff5a}\x{ff21}-\x{ff3a}0-9]

详情unicode编码参照https://blog.csdn.net/mx472756841/article/details/53379762

(在Sublime Text测试可用)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

当然,后面还有部分内容没有转载,可以在原文查看http://www.360doc.com/content/14/1205/19/9152906_430669102.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值