附录-2

首页  后退  前进

正则表达式.

使用正则表达式的命令和参数.

正则表达式是一种在字符串中找到正确的子字符串的简单方法.正则表达式是具有特殊含义的字符和普通字符的组合的字符串,标示目标字符串中可能更改的内容.AutoIt中的正则表达式默认情况下不区分大小写.

正则表达式由一个或多个简单限定词组成.如果符号不在下表中,那么它只对应于自身.

重复符号(*,+,?,{...})将对应于最长的字符串(贪婪匹配),如果紧跟在它们之后有问号'?',模板的一部分将对应于最小长度的字符串(懒惰匹配).

注意:正确的正则表达式可能导致循环,甚至导致"TCIMG"崩溃.

 

方括号外的元字符 

()

将字符串作为整体分组,例如(text).用于匹配多个字符而不止单个,以及进一步使用高级捕获.

[]

方括号为一系列字符或一个字符范围集合,例如[a-z].匹配所示范围内的一个字符,列表和范围可以组合在一起,例如[a-zA-Z];可使用重复符号修饰.

{min,max}

匹配前一个字符重复min和max次,例如{3,8},此外,{3}表示精确匹配3次,{3,}则表示匹配3次或更多.


转义字符,转换元字符作为常规字符(\\表示\,\.表示.,\[表示[,\]表示],\{表示{,\}表示},\*表示*).

^

锚定行开始(或多行文本中的行头),例如^text text$,不占字符位

$

锚定行结束(或多行文本中的行尾),例如^text text$,不占字符位

.

除了换行之外的任意字符(默认.与标记(?s)–则匹配任意字符

|

或(or).可以匹配|前的字符也可以匹配|之后的字符.通常在一个组内,例如(10|20)

?

懒惰匹配,前字符是否存在,匹配尽可能少的字符,可对贪婪匹配进行阻断,-(.*?)

*

贪婪匹配,重复前一字符或组0或多次,匹配尽可能多的字符

+

贪婪匹配,重复前一字符或组1或多次,匹配尽可能多的字符

 

方括号内的元字符 

方括号中包含的模板的一部分称为字符类.在括号内,元字符失去其特殊含义,但属于此类的元字符除外.只有4个字符需要转义\-][.

如果" - "字符在枚举结束时,则不需要转义.可以在模板中使用通配符元字符,但不使用边框元字符,例如\A,\B,\Z,\z,

\b字符表示退格返回字符.请注意范围,例如[а-я]使用UTF-8序列,而不是ASCII.


转义字符

^

在字串首位时匹配在类中的任意一个字符.例如[^3]除3以外任意1个字符

-

范围符号,例如[a-z],即从a到z的任意符号

[]

字符类描述的开始和结束,例如[a-z]

 

通配符元字符 

\1-\9

后向引用,用于模板本身和替换模式中捕获的组的引用,\1代表分组1匹配的文本

$1-$9

指向替换模板中找到的组(9不是限制)

$0\0

搜索的全部模板栈

\a

Chr(7)-报警字符(效果是电脑嘀一声)ASCII-十进制7.BEL(hex 07)

\cn

按下Ctrl+n组合键时产生的控制字符,其中n为字符,例如\cD对应于Ctrl+D.\cA=\001,\cZ=\032,\cM=\r=\015

\e

Chr(27)–匹配escape(hex 1B)

\f

Chr(12)–匹配分页符(hex 0C)

\h

[\t]任意横向空格,制表符-Chr(9),Chr(32),Chr(160)

\H

[^\h]–非空格或制表的字符

\K

重置匹配开始.

\n

@LF,Chr(10)-换行符(hex 0A)

\N

[^\n]任意非换行符(非@LF).3.3.6.1版本中无效

\Q...\E

\Q\E之间的任意元符号被视为文本.不排除错误:\QD:\Edit\1.txt\E

\r

@CR,Chr(13)-回车符号(hex 0D)

\R

[\n\f\r\v]Chr(10),Chr(11),Chr(12),Chr(13)任意换行符

\t

@TAB,Chr(9)制表符-tab(hex 09)

\v

[\r\n\f]Chr(10),Chr(11),Chr(12),Chr(13)垂直制表(@CR@LF和分页符)

\V

[^\v]–任意非垂直制表和分页符Chr(10),Chr(11),Chr(12),Chr(13)(换行)

\x**

其中*-任意十六进制数字字符,例如\x41对应于拉丁字母'A',\x50\x65\x72\x6C–表示Perl

\x{**..}

其中*-任意十六进制数字,例如\x{50}\x{65}\x{72}\x{6C}-表示Perl.\x{01}\x{7F},十进制系统中表示从1到127符号.或者\x{044F}在UTF编码中等于符号"яя"

\***

其中*-任意位八进制数(前补0)\120\145\162\154Perl(\120-八进制代码字母P,\145-字母e,\162-字母r,\154–字母l).空格-\040.取值\001\177,对应基础十进制符号1到127

\G

先前搜索结束的点(主题中的第一个匹配位置)

 

元字符–指定字符范围 

\d

[0-9]-任意十进制数字的字符

\D

[^0-9]任意不是十进制数字的字符

\s

[\f\n\r\t\v]–任意空白字符:Chr(9),Chr(10),Chr(12),Chr(13),Chr(32)(页面换行,制表符,回车,换行和空格).

\S

[^\f\n\r\t\v]-任意非空格字符

\w

[0-9a-zA-Z_]-任意字母,数字字符或下划线(仅拉丁字母的符号)

\W

[^0-9a-zA-Z_]-任意非单词字符

 

字符边界 

\A

文本的开始,不依赖于标志"(?m)",只出现一次

\z

文本的结尾,不依赖于标志"(?m)",只出现一次

\Z

文本的结尾,即任意符号和文本结尾,或直到字符\n,如果出现在表达式末尾,则不依赖于标志"(?m)",只出现一次.

\b

匹配单词非单词字符之间的边界,一侧匹配\W,一侧匹配\w(仅包含拉丁字母单词的边界)

\B

纯单词纯非单词字符之间边界,即两侧同时满足\W\w

 

标志修饰符 

放在正则表达式或组的开头,对正则表达式界限进行修饰

修饰符的状态默认是禁用的,所以必须启用后才能使用.

使用示例:(?i)(Text)或((?-i)Text)

允许合并:(?is)(Text)或((?imsx)Text)

(?i)

不区分大小写,这只适用于拉丁字符.

(?-i)

取消(?i)修饰,(?-x)表示取消此标志前(?x)的修饰,下同

(?m)

在多行文本中符号^和$分别表示行的开始和结束,否则表示仅文本的开始和结束

(?-m)

取消(?m)修饰

(?s)

此选项会让句点(.)匹配包含新行符@LF在内的所有字符(一般情况下,它不能匹配新行符).("一个字符串"模式)

(?-s)

取消(?s)修饰

(?x)

注释模式,不考虑正则表达式各部分之间的空格,并允许使用#作为注释.使样本更易读.示例注释-(?#Text).解释器忽略#符号后面和右括号前面的文本,并用于直接向正则表达式添加注释.

(?-x)

取消(?x)修饰

(?J)

允许重复的名称(允许重复/双重名称.)

(?U)

倒置贪婪模式限定符

(?-U)

取消(?U)修饰

 

组标志 

标志接受组合,例如(?im-sx:Text),开启im,关闭sx.

 参考:正则表达式30分钟入门教程

(?i:...)

在组里使用标志修饰符.(?i:Text)

(?-i:...)

在组里取消使用标志修饰符.(?-i:Text)

(?:...)

匹配Text,但不捕获匹配的文本,也不给此分组分配组号(?:Text)

(?>...)

包括在搜索中,但具备贪婪属性(?>Text)(Text)

(?=...)

零宽度正预测先行断言,断言Text出现的位置的后面匹配表达式(Text)(?=Text)

(?!...)

零宽度负预测先行断言,断言Text的后面不能匹配表达式.(Text)(?!Text)

(?<=...)

零宽度正回顾后发断言,匹配Text后面的位置(?<=Text)(Text)

(?<!...)

零宽度负回顾后发断言,匹配前面不匹配Text的位置,例如:(?<!Text)(Text)

(?<name>...)

匹配文本,并捕获文本到名称为name的组里,作为命名参考.调用一个指定的组名,使用\k<name>.也使用\1$1

(?#...)

这种类型的分组不对正则表达式的处理产生任意影响,用于提供注释让人阅读,例如:(?#这是一个注释).

 

重复字符–应用于字符或组(限定符) 

{n}

精确匹配前一个字符重复n次

{n,}

匹配前一个字符重复n次以上,但尽可能少重复{n,}?

{n,m}

匹配前一个字符重复n到m次(含){n,m}?

*

匹配前一个字符重复0或更多次.{0,}同义.贪婪匹配,即匹配尽可能多的字符.

+

匹配前一个字符重复1或更多次.{1,}同义.贪婪匹配,即匹配尽可能多的字符.

?

匹配前一个字符存在1次或不存在.{0,1}同义.紧跟重复字符后的?如:.*?懒惰匹配,见下文

*?

匹配前一个字符重复0或更多次,限于与模板其余部分匹配的最小捕获(懒惰匹配)

+?

匹配前一个字符重复1或更多次,限于与模板其余部分匹配的最小捕获(懒惰匹配)

??

匹配前一个字符重复01,例如[a-z]??'gg'返回2个空行

 

超级贪婪匹配 

捕获而不回顾以前搜索.捕获匹配前一字符的一切形式.无关于匹配模板的其余部分.表达式范围后的字符不应被超级贪婪所匹配,否则模板将不能正确捕获,并且是无意义的超级贪婪匹配唯一目的就是加速其他捕获. 

*+

匹配前一个字符重复0或更多次.

++

匹配前一个字符重复1或更多次.

{n,}+

匹配前一个字符重复n或更多次.

 

POSIX标准字符类 

 [[:upper:]]{2}-搜索重复的大写字母.

反转范围:[[:^digit:]]

[:alnum:]

字母和数字[0-9A-Za-z](如\w,不含"_")

[:alpha:]

字母[A-Za-z](不含"_")

[:ascii:]

符号,从Chr(0)到Chr(127)

[:blank:]

空格和制表符字符Chr(9)和Chr(32),与[\t]同义

[:cntrl:]

控制字符Chr(0)Chr(31)和Chr(127)

[:digit:]

十进制数字,\d同义,[0-9]

[:graph:]

可打印字符,输出时与[:print:]同义,空格除外(从Chr(33)到Chr(126))

[:lower:]

小写字母,[a-z]同义.

[:print:]

打印时显示的符号,包括空格(从Chr(32)到Chr(126))

[:punct:]

可打印字符,排除文字和数字Chr=(33-47,58-64,91-96,123-126),不属于[:alnum:],[:cntrl:]

[:space:]

空白空间(完全和\s相同,还包括VT:Chr(11))Chr(9)Chr(13)和Chr(32).另含[\f\n\r\t\v]

[:upper:]

大写字母,[A-Z]同义.

[:word:]

文字符即\w

[:xdigit:]

十六进制数[0-9A-Fa-f]

 

条件子模式 

 (?(exp)yes)

(?(?=[a-z])\d),把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式

(?(exp)yes|no)

(?(?<=\d)a|b)(?:(?>(?=[^a-z]*[a-z])())?(?:(?=\1)aa|(?!\1)1)),把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式,否则使用no

(?=[\w]+)|(?R)

递归调用

 

AutoIt3中这些标志不起作用 

\p

任意标点符号

\l

正则表达式的下一个字符被转换为.

\u

正则表达式的下一个字符被转换为.

\L...\E

\L和\E之间的正则表达式中的所有符号都被转换为.

\U...\E

\U和\E之间的正则表达式中的所有符号都被转换为.

\x

任意十六进制字符

\<

一个单词的开始,\W符号和\w符号之间的边界

\>

一个单词的结尾,\w符号和\W符号之间的边界

{,n}

匹配前一个字符重复0或n次.

 

实例 

.*

重复任意字符,意即整个文本

[...]

单个字符的集合,例如[aeiou]-任意小写的元音

[^...]

没有集合的任一符号,例如[^aeiou]-没一个小写的元音

[0-9A-Fa-f]{6}

十六进制数字,匹配FF0000.

[А-яЁё]

俄语字母的范围[А-Яа-яЁё]

 

例子

查找(\r\n|\r|\n){2,}用\1替换   -删除空行

查找(?<![^\s\A])([А-яЁё]+)[\h]+\1用\1替换   -删除单词重复

查找[A-ZА-ЯЁ]{2,}?[a-zа-яё]+  -标识可能有错误的段落开始–个大写字母

查找(.{35,}?)\h替换为$1@CRLF   -在35个字符后第一个被捕获的空格的边界执行换行.

查找 (?si)(?:.*?)?(https?://[\w.:]+/?(?:[\w/?&=.~;\-+!*_#%])*)  -查找链接

查找[A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})   –查找邮箱

 

 


为了学习练习正则表达式,我推荐使用regex命令(译者注:独立版本为 RegExp 2.8)

 

 

附录2-1

 

1.查看Library_Example库中的所有示例,当然还有其它示例

 

附录2-2

 

 

2.注意"替换"的例子,在某些情况下,您只需要找到该行.

这需要毅力和耐心.

对正则表达式的学习和理解,将大大节省自动化操作的时间.

 

它们无处不在,只需点击一下,简单的搜索(替换)就可以解决问题。

它们在许多程序中,允许您快速清除不必要的,保留必要的:

 

在Total Commander中 - 在组重命名中,在搜索对话框中...

 

regexp3

 

 

在文本编辑器AkelPad中...

 

regexp2

 

 

忽视并且不学习正则表达式,你将会被抛弃。

 

这里有一些建议:

1.不要一下子尝试学习一切.您不需要知道正则表达式的所有规则.

2.使用正则表达式解决问题时:

 a)自己试试

 b)如果不成功再阅读相关文献

 c)多请教

 (学习顺序很重要)

3.以实例研究.在互联网上,你可以找到足够的例子.

4.记录下来,保存过去成功的例子.

 


我们来看一个简单的例子(即使没有正则表达式也可以执行任务).

 

有一个字符串 coverAbout

现在只需要保留 About

 

动作对应于图片中的数字.

1.单选按钮设置为"替换"

2.在文本框中,输入字符串 coverAbout

3.在模板字段中创建搜索条件 cover(About)

4.引入替换条件 $1

5.点击"测试"

6.如果测试一切正确,那么"搜索结果"将会有正确的结果

----

7.有关其它信息

8.您可以保存模板

 

附录2-3

 

 


tcimage © Аверин Андрей для Total Commander Image Averin-And@yandex.ru