标签:
绪:以下内容仅仅是本人学习正则表达式时候的简单记录,欢迎拍砖指正
正则表达式就是记录文本规则的代码:描述一组字符串特征的模式
=============================================================================
绪---通配符(wildcard):仅作用于命令行command line中参数argument里的路径path上
* --任意的字符串
? --任意单一字符
[list] --匹配list中的任意单一字符
[!list] --匹配不在list中的任意单一字符
{str1,str2,...} --匹配{ }中的任意一个字符串
注@:1) [! ] 中的 ! 只有放在第一順位時, 才有排除之功
2) [ -] 中的 - 左右两边均有字符時, 才表示范围, 否則仅作 "-"字符处理
3) 以 * 或 ? 开头的 wildcard 不能匹配隐藏文件(即以.开头的文件)
=============================================================================
通配符(出现在argument位置)由shell负责解释(与现有的文件名匹配),与具体的命令(ls,rm,mkdir)无关
正则表达式(出现在option位置上)由具体的应用程序解释(grep,sed,awk),与shell无关
=============================================================================
Regular Expression
字符组合:
abc --表示abc三个连续的字符,但彼此独立而非集合(三个character set)
(abc) --字符集(character set),表示三个连续字符的集合
abc|xyz --表示或abc或xyz这两个character set之一
[abc] --字符组(character class),表示或a或b或c三个单一字符之一(与wildcard 之 [abc] 原理相同)
. --表示除换行符以外的任意单一字符(与wildcard 之 ? 原理相同)
锚点anchor:用于标识RE在句子中的位置所在
^ --句首(字符串的开始)
$ --句尾(字符串的结束)
\< --词首
\> --词尾
修饰符modifier:独立表示时本身不具意义,专门用以修饰前一个character set出现的次数
* --表示前一个character set出现次数大于等于(>=)0
? --表示前一个character set出现次数为0或者1
+ --表示前一个character set出现次数大于等于(>=)1
{N} --表示前一个character set出现N次
{N,} --表示前一个character set至少出现N次
{N,M} --表示前一个character set出现N至M次
注@:在使用modifier的时候不要忽视边界boundary字符的重要性
附@:.* --任意的字符串 # 匹配任意文本
\w --匹配字母或数字或下划线或字母 \W --匹配不是字母、数字、下划线、汉字的字符
\s --匹配任意的空白符 \S --匹配任意不是空白符的字符
\d --匹配数字 \D --匹配任意非数字的字符
\b --匹配单词的开始或结束 \B --匹配不是单词的开始或结束的位置
| --分支条件(从左向右非贪婪匹配)
--------------------------------------------------------
分组:
默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
捕获分组:
(exp) --匹配exp,并捕获文本到自动命名的组里
命名分组:named group
(?<name>exp) --匹配exp,并捕获文本到名称为name的组里,也可以写成(?‘name‘exp),若引用该组则使用\k<Word>
非捕获分组:Non-Capturing Group
(?:exp) --匹配exp,不捕获匹配的文本,也不给此分组分配组号;
注@:非捕获分组不会将内容存储在内存中,不想引用分组的时候可以使用,效率高
原子分组:atomic group
(?>exp) --使用原子分组可以关闭正则表达式的部分回溯操作,提高性能
零宽断言:正则表达式中只有当断言为真时才会继续进行匹配
注@:断言不包括前缀和后缀本身,类似定位符
(?=exp) --匹配exp前面的位置(零宽度正预测先行断言) :断言自身(目标)出现的位置的后面能匹配表达式exp;断言要匹配的后缀
(?<=exp) --匹配exp后面的位置(零宽度正回顾后发断言):断言自身(目标)出现的位置的前面能匹配表达式exp;断言要匹配的前缀
(?!exp) --匹配后面跟的不是exp的位置(零宽度负预测先行断言):断言此(目标)位置的后面不能匹配表达式exp
(?<!exp) --匹配前面不是exp的位置
注释:
(?#comment) --这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释
注@:包含注释的时候,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。
启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉
需要转义的正则元字符:
$ ( ) * + . ? { \ ^ { |
注@: ] 与 - 只有在他们位于一个没有转义的 [ 之后才成为元字符,才需要转义
} 只有在一个没有转义的 { 之后才是元字符,在任何时候都不需要对 } 进行转义
附@:对任意非字母数字的字符进行转义不会改变正则表达式的匹配结果
对一个字母或者数字字符进行转义则会给它一个特殊含义或者出现一个语法错误
----------------------------------------------------------
贪婪与懒惰:
正则表达式默认是贪婪匹配(匹配尽可能多的字符,然后回溯);先吞下后消化
在量词修饰符后加上一个 ? ,则可以转贪婪为懒惰匹配(匹配尽可能少的字符);边吃边消化
在量词修饰符后加上一个 + ,则可以转贪婪为占有匹配(匹配尽可能多的字符,不回溯);食而不化
注@:正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins
------------------------------------------------------------
尚未详细讨论的语法:
代码/语法 说明
\a 报警字符(打印它的效果是电脑嘀一声)
\b 通常是单词分界位置,但如果在字符类里使用代表退格
\t 制表符,Tab
\r 回车
\v 竖向制表符
\f 换页符
\n 换行符
\e Escape
\0nn ASCII代码中八进制代码为nn的字符
\xnn ASCII代码中十六进制代码为nn的字符
\unnnn Unicode代码中十六进制代码为nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串开头(类似^,但不受处理多行选项的影响)
\Z 字符串结尾或行尾(不受处理多行选项的影响)
\z 字符串结尾(类似$,但不受处理多行选项的影响)
\G 当前搜索的开头
\p{name} Unicode中命名为name的字符类,例如\p{IsGreek}
(?<x>-<y>exp) 平衡组
(?im-nsx:exp) 在子表达式exp中改变处理选项
(?im-nsx) 为表达式后面的部分改变处理选项
(?(exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
(?(exp)yes) 同上,只是使用空表达式作为no
(?(name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes) 同上,只是使用空表达式作为no
标签:
原文地址:http://www.cnblogs.com/feyiz/p/5074620.html