参考菜鸟教程和精通正则表达式一书,其中精通正则表达式里面的例子大多都是perl脚本的,工作中也用到perl脚本,还是能看懂的。
正则表达式在线生成工具:http://tools.jb51.net/regex/create_reg
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。
[….]代表结构体,它容许使用者列出在某处期望匹配的字符,通常被称作字符组
正则表达式[ea]能匹配a或者e。gr[ea]y的意思是:先找到g,跟着是一个r接下来是a或者e,最后是一个y。
[]代表着范围,eg[a-z]代表着从a-z的所有字符
()仅代表着匹配的字符,(a-z)代表着能匹配a,-,z三个字符
[^…….] 排除性字符组 未列出的任意字符,排除所有的字符
搜索03/19/76、03-19-76 可以用03.19.76来表示
要想正确使用正则表达式,清楚地了解目标文本是非常重要的
\ 代表转义符(它会让元字符失去特殊含义,成为普通字符)
匹配引号内的字符串”[^”]*”
正则表达式在perl脚本中的使用
非打印字符
\cx(x为A-Z或a-z之一,否则将c视为一个原义‘c’字符)匹配由x指明的控制字符,例如\cM匹配一个 Control-M或回车符
\f换页符
\n换行符
\r匹配一个回车符
\s匹配空白字符
\S匹配任何空白字符
\t匹配一个制表符
\v匹配一个处置制表符
每行的结尾实际是\r\n,如果要是把好多行变成一行的话,把\r\n替换为空
特殊字符(特殊含义的字符)
量词(*+?这三个符号)
1.*号代表前面一位字符可以不出现,或出现多次
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)
2.+号代表着前面一位字符必须出现一次,或出现多次
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)
3.colou?r 代表前面一位字符出现0或一次
可以匹配color或colour
空格符也是普通字符之一,也会触发特殊字符的效果
^ 脱字符 行的起始位置
$字符串结尾位置
() 标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用
* 匹配前面的子表达式零次或多次。要匹配*字符的话,要\*这么写。(0次、1次、多次)
+ 匹配前面的子表达式一次或多次。要匹配+字符的话,要\+这么写。(1次或多次)
. 匹配除换行符\n之外的任何单字符,要匹配.的话,要\.这么写。
[ 标记一个中括号表达式的开始(也叫范围表达式)。要匹配[,请使用\[。
? 匹配前面的子表达式(0次或1次)。
\ 将下一个字符标记或特殊字符,或原义字符字符、或向后引用、或八进制转义符,例如,’n’
匹配字符’n’,‘\n’匹配换行符,序列‘\\’匹配‘\’,而‘\(’则匹配‘(’。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时他表示不接受该字符集合,要匹配^字符本身,请使用\^。
| 指明两项之间的一个选择。要匹配|,请使用\|。
限定符(判断一个条件出现多少次才符合规则的符号)
限定符用来指定正则表达式的一个给定组件必须出现多少次才能满足匹配,有*或+或?或{n,}或{n,m}共6种。
* 匹配前面的子表达式零次或多次,例如,zo*能匹配“z”以及“zoo”。等价于{0,}。>=0
+ 匹配前面的子表达式一次或多次,例如,’zo+’能匹配“zo”以及“zoo“,但不能匹配“z”,等价于{1,}。>=1
? 匹配前面的子表达零次或一次。例如,”do(es)?”能匹配“do”、“does”中的“does”、“doxy”中的“do”。?等价于{0,1}。n=0/1
{n} n表示一个非负整数,匹配确定的n次(匹配的字段里面已经有的个数),例如o{2},能匹配flood,但不能匹配flod。
{n,} n表示一个非负整数,至少匹配n次(相当于>=n次),例如,o{2,}能匹配flooooood,但不能匹配‘flod’。o{1,}等价于o+。o{0,}等价于o*。
{n,m} n和m均为非负整数,其中n<m。最少匹配n次且最多匹配m次,例如,“o{1,3}”将匹配“fooooood”的前三个o。‘o{0,1}’等价于“o?”。(逗号和两个数字之间不能有空格)。
只匹配两位数字的更好的表达式如下:[0-9][0-9]?或[0-9][0-9]{0,1}
、+限定符贪婪与非贪婪情况
*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
例如,您可以搜索HTML文档,以查找在H1标记内的章节标题。该文本在您的文档如下;
<H1>Chapter 1 –介绍正则表达式</H1>
贪婪:下面的表达式 匹配从小于符号(<)到关闭H1标记的大于符号(>)之间的所有内容。
/<.*>/
非贪婪:如果您只要匹配开始和结束H1标签,下面的非贪婪表达式只匹配<H1>。
/<.*?>/
如果只想匹配开始的H1标签,表达式则是:
/<\w+?>/
通过*、+或?限定符之后放置?,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。
定位符
定位符能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。
正则表达式的定位符有:
^ 匹配输入字符串开始的位置,如果设置了RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置,如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b 匹配一个单词边界,即字与空格间的位置。(边界是一个单词的前面和后面)
\B 非单词边界匹配。(只能匹配单词之间的字符,不能匹配边界的字符)
注意:不能将限定符与定位符一齐使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。
要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符,不要将 ^ 的这种用法与中括号表达式内的用法混淆。
若要匹配一行文本的结束处的文本,请在正则表达式的结束使用 $ 字符。
若要在搜索章节标题时使用定位点,下面的正则表达式匹配一个章节标题,改标题包含两个尾随数字,并且出现在行首:
以下例子中的//符号在测试的时候不用加上
/^Chapter [1-9][0-9]{0,1}/
真正的章节标题不仅出现行的开始处,而且它还是该行中仅有的文本.它即出现在行首又出现在同一行的结尾。下面的表达式能确保制定的匹配值匹配章节而不匹配交叉引用。通过创建只匹配一行的文本开始和结尾的正则表达式,就可做到这一点。
/^Chapter [1-9][0-9]{0,1}$/
匹配单词边界稍有不同,但想正则表达式添加了很重要的能力,单词边界是单词和空格之间的位置,非单词边界是任何其他位置,下面的表达式匹配单词Chapter的开头三个字符,因为这三个字符出现在单词边界的后面:
/\bCha/
\b 字符的位置是非常重要的。如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。如果它位于字符串的结尾,它在单词的结尾处查找匹配项
/ter\b/
线面的表达式匹配Chapter中的字符串apt,但不匹配aptttsdf中的apt
/\Bapt/
选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔,但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一选项前来消除这种副作用。
其中?:是非捕获元之一,还有两个非捕获元是?==和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式的模式的位置来匹配搜索字符串,后者为负向检查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
反向引用(把所有符合正则表达式的重复都匹配出来)
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储,缓冲区编号从1开始,最多可存储99个捕获的子表达式。每个缓冲区都可以使用\n使用,其中n为一个特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符?:、?=或?!来重写捕获,忽略对相关匹配的保存。
反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力,以下面的句子为例:
Is is the cost of of gasoline going up up?
上面的句子很显然有多个重复的单词。如果能设计一种方法定位该句子,而不必查找每个单词的重复出现,那该有多好,下面的正则表达式使用单个子表达式来实现这一点:
元字符
\b 匹配一个单词边界,单词和空格键的位置
\B 匹配非单词边界。
\cx 匹配由x指明的控制字符,例如\cM匹配一个Control-M或回车符,x的值必须为A-Z或a-z之一。否则将c视为一个原义’\c’字符。
\w 匹配字母、数字、下划线,等价于’[A-Za-z0-9_]’。
\W 匹配非字母、数字、下划线的所有,等价于‘[^A-Za-z0-9_]’。
\d 匹配一个数字字符,等价于[0-9]。
\D 匹配一个非数字字符,等价于[^0-9]。
\s 匹配任何空白字符。
\S 匹配任何非空白字符。
\t 匹配一个制表符。等价于\x09和\cK
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\n 括号能够“记忆”其中的子表达式匹配的文本,无论文本是什么,元字符序列\1都能记住他们。多个括号的时候,使用\1,\2,\3,等来表示第一、第二、第三括号匹配的文本。
例如([a-z])([0-9])\1\2中\1代表[a-z]匹配的内容,\2代表[0-9匹配的内容]
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两位数字长。例如,‘\x41’匹配“A”。‘\x041’则等价于‘\x04’$”1”。正则表达式中可以使用ASCII编码。
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,‘(.)\1’匹配两个连续的相同字符。
\un 匹配以n类型编码格式的字符。详见另一篇博客匹配中文字符https://blog.csdn.net/yyf960126/article/details/85048591
浮点数:^([-+]?[0-9]+(\.[0-9]*)?)
P82
\1代表第一段正则匹配的文字,\2代表第二段匹配,\3代表第三段匹配