-1----------------------------------------------------------------------------------
什么是正则表达式?
正则表达式(regular expression),在perl里通常是也叫模式匹配(pattern),是用来表示
匹配(不匹配)某个字符串的特征的模板。
使用简单模式:
$_='yabb dabba doo';
if(/abba/)
{
print "It matched\n";
}
表达式/abba/会在$_查找这个四个字组成的字符串,如果找到返回真。
Unicode属性:
Unicode字符能够理解自身含义,它们不只是简单的字节序列。每个字符除了字节组合之外,
还附带着属性信息。
若要匹配某项属性,只需要把属性名放入\p{PROPERTY}里面。比如匹配有许多空白符
(whitespace),相应的属性名为Space,所以匹配带有这属性字符,可以用\p{Space}表示:
if(\p{Space}) #总共有26个不同的字符带有此属性
{
print "The string some whitespace\n";
}
if(/\p{Digit}/) #总共有411个不同的字符带有些属性
{
print "The string has a digit\n";
}
关于元字符:
点(.):是能匹配任意一个字符的通配符(除换行符\n)
星(*):是能匹配前面的条目零次或多次。
加(+):是能匹配前面一个条目一次或一次以上
问号(?):是匹配前一个条目出现一次或零次
模式分组:
在正则表达式中,圆括号((),或称小括号)的作用是对字符串的分组。因此也是元字符。
/testtesttest/;
/(test)+/;
圆括号中模式匹配的文字也称为捕获组。
反向引用的写法是在反斜线后面接上数字编号 \1,\2像这样。
$_='abba';
if(/(.)\1/)#匹配bb,(\.)\1表明需要匹配连连续出现的同样的字符。
{
print "$_\n";
}
$_='yabba dabba doo';
if(y(....) d\1)#匹配abba
{
print "get\n";
}
$_='aa111bb';
if(/(.)\111/)
{
print "get\n";
}
像这样连续出多个数字,那在这里到底是要匹配\1,\11,还是\1111呢?
其实在这个问题上perl逻辑很简单,它尽可能创建多数量的反引用,所以最终匹配\111.
\g{1},这样就能消除部分的二义性。
if(/(.)/\g{1}11)
{
print "get\n";
}
还可以引用负数
$_='xaa11bb';
if(/(.)(.)\g{-1}11/)
{
print "get\n";
}
选择一个匹配:
竖线(|) :通常读或,意思是要么匹配在左边的内容,要么匹配右边的内容
if(/fred|barney|test/)
{
print "get\n";
}
匹配字符集:
字符集(character class)指的是一组可能出现的字符,通常写在Y方括号内[]表示
$='Teh HAL-90000 requires authorization to contine.';
if(/HAL-[0-9]/)
{
print "$_\n";
}
要想匹配这些字符集除外可以在前面加脱字符(^)
[^0-9] 表示匹配除0-9以外的字符
字符集的简写:
\d 表示匹配数字集等同于[0-9]
\s 表示匹配任意空白符,效果等等同于unicode属性的\p{Space}
\s 仅能表示以下5个字符换页符(form-feed),水平制表(tab),换行符(newline),
回车符(carriage return)及空格符本身[\f\t\n\r]
\h 表示匹配水平空白符
\v 只能匹配垂直空白符
\h\v并起来就成了\p{Space}
\w 称作"单词"字符,尽管它能匹配的字符并不是严格意义上的单词。
在ASCII语义下,\w匹配是一组字符:[a-zA-Z0-9]
-1----------------------------------------------------------------------------------
正则表达式-1
最新推荐文章于 2022-03-05 12:54:36 发布