标签:
^ |
行首标志 |
$ | 行末标志 |
如^cat$即一整行只有cat这个单词,^$则是一个空行
[ ] | 字符组,用来匹配若干字符之一 |
如gr[ae]y,即grey或者gray
- | 在字符组内部,字符组元字符‘-‘(连字符)表示一个范围(前提是不在字符组开头) |
如<H[123456]>和<H[1-6]>是一样的。而[0-9] [a-z] [A-Z]分别用于匹配所有数字、小写字母和大写字母,还可以写成多重范围[]0-9a-zA-Z]
注意,只有在字符组中,‘-‘才是元字符,其他情况只是一个普通符号
^ | 排除型字符组,会匹配任何未列出的字符 |
如[^1-6]匹配除了1,2,3,4,5,6以外的任意字符
用q[^u]来匹配单词,能匹配出qoph,但是不能匹配出Iraq。因为排除型字符组是匹配一个除列出字符以外的字符,也就是它必须匹配一个字符,这个和不匹配字符是有区别的。
. | 匹配任意字符 |
元字符‘.‘用来匹配任意字符,也就是说所有字符都可以用.来匹配。但是注意,在字符组中,.只是一个普通字符,只用来匹配点号
如,匹配03/19/76 、03-19-76或者03.19.76,我们可以用03[-./]19[-./]76,或者03.19.76。
但是注意,03.19.76同样可以匹配03319 76这样的字符串,因为点号可以匹配任意字符。所以用03[-./]19[-./]76会更加准确,但是也更加难读,难写
( | ) | 多选结构,元字符‘|‘表示‘或‘ |
依靠它,我们可以把不同的子表达式组合成一个总的表达式,而这个总表达式又可以匹配任意子表达式。这就是多选分支,它和字符组不同,字符组匹配的是一个字符,而多选分支匹配的是多个子表达式中的一个
如,Bob和Robert是两个表达式,但是用Bob|Robert就可以同时匹配这两个表达式。前面的gr[ae]y可以写成gr(a|e)y。
再如,^From|Subject|Data:和^(From|Subject|Data):是不同的
\b | 单词分界符,元字符‘\b‘由两个字符组成,\和b,作用是分隔单词 |
\b和^、$一样,都是对位置的锚定,而不是匹配一个真正的字符。在一个单词的前后加上\b,可以准确的匹配到该单词
如果想要匹配cat,只是用cat匹配,有可能会匹配到stdcatup中的cat,但是如果用\bcat\b来匹配,结果肯定是cat
对于单词分界符,不同流派的正则表达式有不同的符号,这里提到的是perl
? | 可选项元素,元字符‘?‘代表可选项,即是说?前面的一个字符是可有可无的 |
用colou?r可以匹配color和colour
再如匹配表示7月4号(July fourth)的文本,其中月份可能写作July或者Jul,而日期可能写作fourth、4th、4,可以用July?(fourth|4(th)?)来匹配。
+ | 之前紧邻的元素出现一次或者多次 |
* | 之前紧邻的元素出现任意多次,或者不出现 |
? | 之前紧邻的元素出现一次或者不出现 |
在使用时,经常把+号或者*号作用于空格,来消除空格的影响。如,如果你确定有至少一个空格,就可以用 +来匹配,如果不确定空格的数量,甚至可能没有,就用 *来匹配
{min,max} | 限定重现次数 |
某些支持正则表达式的语言支持另外一种很方便的限定一个字符或者一个子表达式重复出现的次数,如[]a-zA-Z]{1,5}来匹配美国的股票代码(1到5个字母)
?其实和{0,1}起到同样的作用
( ) | 括号的捕获功能 |
括号有两种用途①限制多选项的范围,以及将若干字符组合为一个子表达式,受问号或星号之类的量词作用;②记忆它们包含的子表达式匹配到的文本
在perl中,括号会把匹配到的文本记录在$1、$2、$3……等以数字名为变量名的变量当中。
在一个正则表达式中如果使用了多个括号,那么变量按顺序对应相应的括号,括号是按开括号‘(‘从左到右的出现顺序进行的。
例如([0-9])([a-z]),$1就是储存[0-9]匹配到的内容,$2就储存[a-z]匹配到的内容
\ | 转义符‘\‘作用就是使跟在它后面的元字符失去意义,变成普通字符,不过在字符组内转义符无效 |
如,要匹配(very),就用\([a-z]+\)来匹配,这样,就是匹配一个开括号,然后跟着至少一个英文小写字母,在跟着一个闭括号。
perl用起来很方便,可以把所有单个变量都存储在一种标量变量中,标量变量以$加上变量名表示perl也支持各种数学运算符号
和其他语言一样,支持各种循环结构(while,for),条件语句(if else)
1 $Celsius=20; 2 While($Celsius<=45) 3 { 4 If($Celsius>0) 5 {$Fahrenheit=($Celsius*9/5)+32;} 6 Print "$Celsius C is $Fahrenheit F.\n" 7 $Celsius+=5; 8 }
perl中最简单的使用正则表达式的方式就是匹配某个文本
用=~m//这个表达式来匹配
m是match这个命令,/....../两个斜杠中间是正则表达式,=~用来连接m/....../和欲搜索的字符串
1 print "Enter a temperature in Celsius:\n"; 2 $ceisius=<STDIN>; 3 chomp($celsius);#去掉celsius末尾的换行符 4 if($celsius=~m/^[0-9]+$/); 5 { 6 $fahrenheit=($celsius*9/5)+32; 7 print "$celsius C is $fahrenheit F.\n" 8 }else {print "Expecting a number."}
如果要转换华氏度和摄氏度,我们应该更加合理的处理用户的输入。例如需要有正负号、小数点、单位等等。
1 print "Enter a temperature in Celsius: \n"; 2 $input=<STDIN>; 3 chomp($input); 4 if($input=~m/^([+-]?[0-9]+(\.[0-9]*)?)([CF])$/) 5 { 6 $inputnum=$1; 7 $type=$3; 8 if($type=~m/c/) 9 { 10 $celsius=$inputnum; 11 $fahrenheit=($celsius*9/5)+32; 12 } 13 else{ 14 $fahrenheit=$inputnum; 15 $celsius=($fahrenheit-32)*5/9; 16 } 17 print "$celsius C is $fahrenheit F. \n" 18 }else {print "Expecting a number."}
(?:......) | 非捕获型括号,只分组,不捕获,不会对捕获括号的顺序产生影响 |
我们用(\.[0-9]*)?来正确分组,这样我们就能使问号正确的作用于整个(\.[0-9]*,可是这样括号中的内容就会被捕获而且放到$2中,可是我们不会使用$2
1 $input=~m/^([-+]?[0-9]+(?:\.[0-9]*)?)([CF])$/#即使[CF]的括号排在第三位,但它匹配的文本还是会存放在$2当中
=~m/....../i | 使正则表达式忽略大小写来匹配 |
\t | 制表符 |
\n | 换行符 |
\r | 回车符 |
\s | 任何空白字符 |
\S | 除\s之外的任何字符 |
\w | [a-zA-Z0-9] |
\W | 除\w之外的任何字符 |
\d | [0-9] |
\D | 除\d之外的任何字符 |
用\s匹配所有空白,表示空白的符号很多,有空格,制表,换行,回车,退格等等。\s可以用来匹配所有的空格符,以后要匹配空格的时候可以使用\s*
1 print "Enter a temperature in Celsius:\n"; 2 $input=<STDIN>; 3 chomp($input); 4 if($input=~m/^([+-]?\s*[0-9]+(?:\.[0-9]*)?)\s*([CF])$/i) 5 { 6 $inputnum=$1; 7 $type=$2; 8 if($type=~m/c/) 9 { 10 $celsius=$inputnum; 11 $fahrenheit=($celsius*9/5)+32; 12 } 13 else{ 14 $fahrenheit=$inputnum; 15 $celsius=($fahrenheit-32)*5/9; 16 } 17 print "$celsius C is $fahrenheit F.\n" 18 }else {print "Expecting a number."}
标签:
原文地址:http://www.cnblogs.com/XBlack/p/4858023.html