-1-----------------------------------------------------------------------------------------------------------------
1.用m//进行匹配:
m//(pattern match operator,模式匹配操作符)
还可以选择其界定符号,m(test),m<test>,m{test},m[test],m,test,m!test!.
是不是看到这么的界定符有点晕了吧,其实我们选择一个常用的就可以了或你喜欢的界定符号。
2.模式修饰符:
perl有好几个模式修饰符(modifier),有时候也叫标志(flag),它们是一种追加在模式表达末尾定界符后面的的字母,用来
修改默认的匹配行为。
2.1.用/i进行大小写无关的匹配
print "Would you like to play a game? ";
chomp($_=<STDIN>);
if(m/yes/i) #进行大小写无关的匹配
{
print "In that case, I recomment that you go bowling.\n";
}
2.2.用/s匹配任意字符
默认情况下,点号(.)无法匹配行行,这对于大多数单行匹配情况下是合适的。但如果字符串出现换行符,而你希望点能
匹配这些换行符,那么/s修饰符就可以完成这个换行符的匹配。
$_='I saw Barney\ndown at the boling alley\nwith Fred\nlast night.\n';
if(/Barney.*Fred/)
{
print "That string mentions Fred after Barney\n";
}
2.3.用/x加入空白符
第三个修饰符允许我们在模式里随意加空白符,从而使他更容易阅读,理解:
/-?[0-9]+\.?[0-9]*/ #挤在一起,难阅读
/ -? [0-9]+ \.? [0-9]*/x #加入空白好多了
/
-? #一个可有可无的符号
[0-9]+ #小数点前必须出现一个或多个数字
\.? #一个可有可无的小数点
[0-9]* #小数点后面的数字,有没有都没有关系
/x
2.4.组合选项修饰符:
if(/barney.*fred/is) #同时使用/i and /s
{
print "Taht string metnions fred after Barney\n";
}
if(m{
barney # barney
.* #任意字符
fred #fred
}six) {#同时使用 /s , /i /x
print "That string mentions Fred after Barney\n";
}
-1-----------------------------------------------------------------------------------------------------------------
-2-----------------------------------------------------------------------------------------------------------------
字符解释符方式:
三种字符解释符:
ACSII 修饰符/a 它会告诉perl仅在ASCII范围内阐释\w,\d和\s等字符集。
Unicode 修饰符/u 它会告诉perl仅对上面这写简写采用宽泛的匹配方式,只要是Unicode范围内定义的单词,数字,空白,都能匹配。
locale 修饰符/l 它会告诉perl按照本地化设定阐释简写的意义,所以任何一个本地设定的字符编码认为是单词的字符 ,都会被\w简写匹配。
/\w+/a #仅仅是A-Z,a-z,0-9,_这些字符
/\w+/u #任何Unicode当中定义单词的字符
/\w+/l #类同于ASCII的版本,但单词的定义取决于本地化设定,所以如果设定为Latin-9的话
chr() 函数,转换字符
-2-----------------------------------------------------------------------------------------------------------------
-3-----------------------------------------------------------------------------------------------------------------
锚位:
\A 锚位匹配字符串的绝对开头 ,如果开头位置上不匹配,是会顺移下一个位置继续尝试。
m{\Ahttps?://}i
\z 锚位匹配字符串绝对末尾。
m{\.png\z}i
\Z 行末锚位,它允许后面出现换行符
脱字符:
^:表示字符串开头锚位
$: 表示字符串结尾
/fred$/
/^barney/
单词锚位:
锚位不局限于字符串首尾,比如\b是单单词边界锚位,它匹配任何单词的首尾。
/\bfred\b/ #可匹配fred, 无法匹配frederic,alfred
\b 锚位匹配的是一组连续的\w字符的开头或结尾。
that 's a "word" bondary
-3-----------------------------------------------------------------------------------------------------------------
-4-----------------------------------------------------------------------------------------------------------------
绑定操作符=~
默认情况下匹配的操作对象是$_,绑定操作符(bingding operator, =~)会告诉perl,拿右边的模式来匹配左边的字符串,而不是
匹配$_.
my $some_ohter = "I dream of betty rubble.";
if(#some_ohter =~ /\brubble/)
{
print "Aye,there's the rub.\n";
}
模式中的内插
正则青表达式内部可以进行双引号形式的插入。
my $what = 'larry';
while(<>)
{
if(/\A($what)/)
{
print "We waw $what in beging of $_\n";
}
}
不管$what的内容是什么,当我们进行模式匹配时,该模式会由$what的值决定。在这里,它等效于/\A(larry)/,也就在每行开
头寻找larry.
-4-----------------------------------------------------------------------------------------------------------------
-5-----------------------------------------------------------------------------------------------------------------
捕获变量
圆括号出现的地方一般都会触发正则表达式引擎捕获匹配到的字符串。捕获组会把匹配圆括号中模式的字符串保存到相应的地方。
既然这些捕获变量保存的是字符串,那就说明白它是标量。 在perl里的名称就是$1,$2这样的形式存储它们的结果。
$_='Hello there, neighbor';
if(/\s([a-zA-Z]+),/)
{
print "$1\n"; #result 捕获空白符和逗号之间的单词
}
捕获变量的存续期
捕获变量通常能存活到下次成功匹配为止。也就是说,失败的匹配不会改动上次成功匹配时捕获的内容,而成功的匹配匹配会将它们的重置。
不捕获模式
(?:) 匹配但捕获结果
if(/(?:bronto)?saurus (steak|burger)/)
{
print "Fred wants a $1\n";
}
命名捕获
(?<LABLE>PATTERN),其中LABLE可以自行命名。
访问变量: $+{LABLE}
my $names = 'Fed or Barney';
if($names = ~m/?<name1>\w+ (?:and|or) (?<name2>\w+)/)
{
say "I saw $+{name1} adn $+{name2}\n";
}
自动捕获变量
$` 匹配区段之前的的内容
$' 匹配到区段之后的内容
$& 匹配整个区段的内容
-5-----------------------------------------------------------------------------------------------------------------
-6-----------------------------------------------------------------------------------------------------------------
优先级
1.最高级是圆括号("()"),用于分组和捕获。圆括号里的东西总是比其他东西更有紧密性。
2.第二级量词,也就是重复操作符:*, +,?,以及花括号表示的量词,比如{5,15},{3,} and {5}
3.第三级是锚位和序列.\A,\Z,\z, ^, \b and \B
4.第四级是择一竖线(|),由于它位于优先级表底部,所以从效果上来看,它会把各种模式拆分成数个组件
圆括号(分组或捕获) (...),(?:...),(?<LABLE>...)
量词 a*,a+,a?,a{n,m}
锚位 abc,^,$, \A,\b,\z,\Z
择一 a|b|c
原子 a,[abc],\d,\1,\g{2}
-6-----------------------------------------------------------------------------------------------------------------
正则表达式-2(匹配)
最新推荐文章于 2022-02-09 17:10:36 发布