正则表达式中,有关问号的用法整理
上一篇 /
下一篇 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: