使用正则表达式的命令和参数.
正则表达式是一种在字符串中找到正确的子字符串的简单方法.正则表达式是具有特殊含义的字符和普通字符的组合的字符串,标示目标字符串中可能更改的内容.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或更多次,限于与模板其余部分匹配的最小捕获(懒惰匹配)
|
??
|
匹配前一个字符重复0或1次,例如[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)
1.查看Library_Example库中的所有示例,当然还有其它示例
2.注意"替换"的例子,在某些情况下,您只需要找到该行.
这需要毅力和耐心.
对正则表达式的学习和理解,将大大节省自动化操作的时间.
它们无处不在,只需点击一下,简单的搜索(替换)就可以解决问题。
它们在许多程序中,允许您快速清除不必要的,保留必要的:
在Total Commander中 - 在组重命名中,在搜索对话框中...
在文本编辑器AkelPad中...
忽视并且不学习正则表达式,你将会被抛弃。
这里有一些建议:
1.不要一下子尝试学习一切.您不需要知道正则表达式的所有规则.
2.使用正则表达式解决问题时:
a)自己试试
b)如果不成功再阅读相关文献
c)多请教
(学习顺序很重要)
3.以实例研究.在互联网上,你可以找到足够的例子.
4.记录下来,保存过去成功的例子.
我们来看一个简单的例子(即使没有正则表达式也可以执行任务).
有一个字符串 coverAbout
现在只需要保留 About
动作对应于图片中的数字.
1.单选按钮设置为"替换"
2.在文本框中,输入字符串 coverAbout
3.在模板字段中创建搜索条件 cover(About)
4.引入替换条件 $1
5.点击"测试"
6.如果测试一切正确,那么"搜索结果"将会有正确的结果
----
7.有关其它信息
8.您可以保存模板
© Аверин Андрей для Total Commander Image Averin-And@yandex.ru
|