正则表达式中,有关问号的用法整理

上一篇 / 下一篇  2012-05-24 22:08:49 / 个人分类:perl相关

 

 

每次看到,想到正则表达式中的?和包含?的特殊字符,我脑子里就是一片混沌。

今天特意找相关的书籍,把它们都分清楚。

?
(?:  )
(?=  )
(?<= )
(?<! )
(?!  )

第一个?,代表量词,位于它前面的字符可以不出现,也可以只出现一次(单次可选)
例子如下:两个字符串都会匹配
#!/usr/bin/perl

$str = "zhengzebiaodashi";
$str2 = "zhenzebiaodashi";
if( $str =~ /zheng?/g ){
 print "match\n";
}else{
        print "no match\n";
}

if( $str2 =~ /zheng?/g ){
 print "match\n";
}else{
        print "no match\n";
}

单个问号的另外一层意思
单个问号用在其他量词比如+,*这时代表的是 非贪婪模式
非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:
表达式 匹配结果
(d)(\w+?) "\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x"
(d)(\w+?)(d)    为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx"


第二个(?:  ) 代表 非捕获型括号,只分组不捕获
例子如下:没有使用(?:  )和使用了(?:  )输出的$1,$2不同
#!/usr/bin/perl

$str1 = "zheng  ze   biao da  shi";
$str2 = "zheng  ze   biao da  shi";
if( $str1 =~ /(\w+)\s+(\w+)\s+(\w+)\s+/g) {
 print "$1  $2  \n";
}

if( $str2 =~ /(?:\w+)\s+(\w+)\s+(\w+)\s+/g) {
 print "$1  $2  \n";
}

下面是四种环视,
(?=  )  肯定顺序环视
(?<= )  肯定逆序环视
(?<! )  否定逆序环视
(?!  )  否定顺序环视

环视结构不匹配任何字符,只匹配文本中的特定位置,不太好理解,只找到一个例子
给数字特定位置加入逗号
#!/usr/bin/perl

$str = "298444215";
$str =~ s/(?<=\d)(?=(\d\d\d)+$)/,/g;

print $str;

输出结果:298,444,215


TAG:

 

评分:0

我来说两句

Open Toolbar