方正书版本身并不直接使用标准的Perl或Python风格的正则表达式,而是使用其内置的查找替换功能,该功能支持通配符,其理念和核心作用与正则表达式高度相似,可以理解为一种“类正则”或“简化版正则”的功能。
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),它是一种文本模式,同时也是计算机科学的一个概念,其中包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
掌握正则表达式,首先需要掌握正则表达式元字符,即在正则表达式中不表示自己字面上的字符,而是用来控制匹配规则的逻辑和行为。
1.[*]:匹配前面的子表达式零次或多次。示例:\d*可以匹配任何数字组成的字符串,包括空字符串。例如,“123”,“”,“000”。
2.[+]:匹配前面的子表达式一次或多次。示例:【a-z】+会匹配至少一个小写字母,如“hello”,但不匹配空字符串。
3.[?]:匹配前面的表达式零次或一次。示例:colou?r匹配“color”或“colour”,表示“u”可以出现也可以不出现。
4.[{m}]:精确匹配m次。示例:\d{3}仅匹配三个数字,如“123,但不匹配“12”或者“1234”。
5.[{m,n}]:匹配前面的子表达式至少m次,但不超过n次。示例:[A-Z]{2,4}匹配2到4个大写字母,如“AB”,“ABC”,"ABCD",但不匹配单个字母或超过四个字母的字符串。
1.[^]:在模式开始处匹配,如果在方括号内,则表示取反。示例:^Hello在多行模式下,匹配每行开头为为“Hello”的行。
2.[$]:在模式结束处匹配。示例:world$ 在多行模式下,匹配每行结尾为“world”的行。
3.[\b]:匹配单词边界。示例:\bthe\b 只匹配独立的单词“the”,不匹配“there”中的“the”。
4.[\A]:匹配字符串的开始。示例:\AStart 确保整个字符串从“Start”开始。
5.[\Z]:匹配字符串的结束,或在行尾前的结束。示例:在多行模式下,End\Z 确保字符串或每行的结束是“End”。
1.[[abc]]: 匹配任何一个在方括号内的字符。示例:[abc]at 匹配“cat”,“bat”,“cat”。
2.[[^abc]]: 匹配任何不在方括号内的字符。示例:[^abc]at 匹配除了“a”、“b”、“c”之外的任何字符紧跟“at”,如“dat”。
3.[[0-9]]: 等同于\d,匹配数字。示例:等同于\d,[0-9]{2} 匹配任意两位数字,如“12”。
4.[[a-zA-Z]]: 匹配任何字母。示例:匹配任何单个字母,如“a”到“z”或“A”到“Z”。
1.[.]: 匹配除换行符之外的任意单个字符。示例:. 匹配除换行符外的任意字符,.com 会匹配任何以“.com”结尾的字符串,如“example.com”。
2.[\]: 用于转义特殊字符,使其失去特殊含义,如\.匹配点号本点号本身。示例:\. 匹配点号本身,而不是任何字符,如\.\d匹配点后跟着数字,如“1.2”。
3.[|]: 用于选择,表示“或”,匹配左边或右边的表达式之一。示例:red|blue 匹配“red”或“blue”。
1.[( )]: 分组,将括号内的表达式作为整体处理,也可以用于后向引用。
示例:(abc)\1 匹配“abcabc”,其中\1引用第一个括号内的内容。
2.[\1, \2, ...]: 引用前面分组的内容,用于重复匹配。
示例:(.\d+)(.\d+)\2\1 匹配两个数字序列并确保它们按相同的顺序重复,如“12321”。
1.[(?=...)]: 正向前瞻,确保后面跟的是...但不消耗字符。示例:word(?=ing) 匹配“word”仅当其后紧跟“ing”,但不包括“ing”。
2.[(?!...)]: 负向前瞻,确保后面不跟的是...。示例:word(?!ing) 匹配“word”但不匹配其后紧跟“ing”的情况。
3.[(?<=...)]: 正向后顾,确保前面是...但不消耗字符。示例:(?<=\d)th 匹配任何数字后的“th”,确保“th”前有数字,但不包括数字。
4.[(?<!...)]: 负向后顾,确保前面不是...。示例:(?<!\d)th 匹配“th”,但确保它前面不是数字。
零宽度断言(Zero-Width Assertions)是正则表达式中一种特殊的技术,它们用于匹配特定的位置,而不消耗或匹配任何实际的字符。这意味着它们不会成为匹配结果的一部分,但可以帮助控制匹配的上下文条件。零宽度断言分为两大类:前瞻断言(Lookahead Assertions)和后顾断言(Lookbehind Assertions)。
前瞻断言允许你指定一个位置,该位置之后必须满足某个条件,但不包括这个条件本身在匹配结果中。
1.正向肯定预查 (?=...):确保紧跟当前匹配点之后的模式存在,但不匹配它。示例:\w+(?=\s*=\s*"[^"]*") 会匹配URL参数前的关键词,如在keyword="value"中匹配keyword,但不包括等号及引号内的内容。
2.正向否定预查 (?!...):确保紧跟当前匹配点之后的模式不存在。示例:^.*(?!\.)$ 会匹配不以点号结尾的行。
二、后顾断言
后顾断言检查匹配点之前的文本是否满足某个条件,同样不消耗字符。
1.负向后顾预查 (?<!...):确保匹配点之前不出现某个模式。示例:\b(?<!\d)\d+\b 匹配独立的数字,但不匹配数字串中的数字,如在“123abc456”中匹配“123”和“456”。
2.正向后顾预查 (?<=...):确保匹配点之前确实出现了某个模式。示例:(?<=\d)\D 会匹配任何非数字字符,但仅当其前是一个数字时。
方正书版中的应用案例
案例一:批量添加大题题号注解
|
|
|
|
|
|
|
|
|
(^[一|二|三])(、)=[HTH]\0[HT][ZK(]
|
案例二:批量添加小题题号注解
|
|
|
|
|
|
|
|
|
^\d+\.=\d[ZK)]\n[STF5]\0[ST][ZK(]
\(\d{4}·[^)]+\)=[HTH]\0[HT]
|
更多案例,敬请关注!