代码改变世界

Perl正则表达式之模式匹配

2015-05-13 22:06  西风狂诗曲  阅读(3281)  评论(0编辑  收藏  举报

1. 正则表达式运算符

  i 关闭大小写敏感性
      m 将字符串作为多行处理
      o 只编译模式一次 。 用于优化搜索流程
      s 嵌入换行符时 , 将字符串作为单行处理
      x 允许在正则表达式中提供注释 , 并忽略空白字符。

      g全局匹配 。 即查找所有具体值 。 如果用于数组型上下文语境 , 则会返回一个列表 ; 如果用于标量型上下文语境 , 则返回真或假。

 

     perl中的正则表达式的强大是公认的,下面我们就来看看他长得什么样。

   最简单的正则表达式就是/regular expression/,两个斜杠中间的内容代表了你要匹配的内容,这样就构成了最简单的正则表达式,还可以这样,m/regular expression/,m#regular expression#,m'regular expression'...也就是说,你要将表达式的内容用m和对称的符号进行包裹,就会构成匹配了。说了这么多我们来看例子吧。

 

while(<DATA>){

print if /Betty/;
}

_ _DATA_ _
Steve Blenheim
Betty Boop #匹配到Betty
Igor Chevsky
Norma Cord
Jon DeLoach
Karen Evich


(The Script)

while(<DATA>){
print unless /Evich/;#unless = if not,看到unless就把它转换成if 然后表达式的取反。
}

_ _DATA_ _
Steve Blenheim
Betty Boop
Igor Chevsky
Norma Cord
Jon DeLoach
Karen Evich
# Print line unless it matches Evich
#(输出)
#Steve Blenheim
#Betty Boop
#Igor Chevsky
#Norma Cord
#Jon DeLoach





while(<DATA>){

print if m#Jon#
# Print the line if it matches Jon
}
_ _DATA_ _
Steve Blenheim
Betty Boop
Igor Chevsky
Norma Cord
Jon DeLoach
Karen Evich
#(Output)
#Jon DeLoach

$_ = "I lost my gloves in the clover, Love.";
@list=/love/g; #匹配到了gloves和clover中的love,然后将他们以数组的形式返回。Love没有匹配到是因为没有打开i这个忽略大小写的开关。下面的例子中会看到。
print "@list.\n";
#(Output)
#love love.

$_ = "I lost my gloves in the clover, Love.";
@list=/love/gi;
print "@list.\n";
#(Output)
#love love Love.  输出结果的原因请参考上面的例子。


#################################
#特殊标量 $& 中保存着上一次成功的搜索过程中所匹配的字符串值 。 &`(ESC下面的那个键)保存了成功匹配模式之前所找到的内容 。 &' 则负责保存成功匹配模式之后找到的内容 。


$_="San Francisco to Hong Kong\n";
2
/Francisco/;
print $&,"\n"; 4
/to/;
print $`,"\n"; # Save what comes before the string 'to' 小技巧:只要记住`往前倾斜,所以是之前的。剩下的就是匹配到的之后的
/to\s/;
print $', "\n"; # \s represents a space
# Save what comes after the string 'to'
# Save 'Francisco' in $& if it is found
#(Output)

#Francisco

#San Francisco

#Hong Kong






###############################

#s 运算符与替换

###############################




while(<DATA>){
s/Norma/Jane/; #最简单的替换,找到Norma,然后替换成Jane。
print;
}

_ _DATA_ _
Steve Blenheim
Betty Boop
Igor Chevsky
Norma Cord
Jon DeLoach
Karen Evich
# Substitute Norma with Jane
#(Output)
#Steve Blenheim
#Betty Boop
#Igor Chevsky
#Jane Cord
#Jon DeLoach
#Karen Evich



while(<DATA>){
print if s/Tom/Christian/g; #全局匹配并替换。
}
_ _DATA_ _
# All occurrences of Tom on each
# line are replaced with Christian171
#正则表达式 —— 模式匹配
Tom Dave Dan Tom
Betty Tom Henry Tom
Igor Norma Tom Tom
#(Output)
#Christian Dave Dan Christian
#Betty Christian Dick Christian
#Igor Norma Christian Christian




while(<DATA>){
print if s/igor/Daniel/i; #i忽略大小写。
# Substitute igor with Daniel
}
_ _DATA_ _
Steve Blenheim
Betty Boop
Igor Chevsky
Norma Cord
Jon DeLoach
Karen Evich
#(Output)
Daniel Chevsky


while(<DATA>){
s/6/6 * 7.3/eg; # 找到匹配6然后求值并全局替换。
print;
}
_ _DATA_ _
Steve Blenheim  5
Betty Boop    4
Igor Chevsky    6
Norma Cord    1
Jon DeLoach    3
Karen Evich    66
#(Output)
#Steve Blenheim     5
#Betty Boop        4
#Igor Chevsky        43.8
#Norma Cord        1
#Jon DeLoach        3
#Karen Evich        43.543.8


###################################
#模式匹配的含义
###################################
示例                涵义
$name =~/John/         如果 $name 含有模式则为真 。 如果是真 , 返回 1 ; 否则返回空值
$name !~/John/         如果 $name 不含有模式 , 则为真
$name =~s/John/Sam/     将匹配 John 的第一个值替换为 Sam
$name =~s/John/Sam/g     将匹配 John 的所有具体值替换为 Sam
$name =~tr/a-z/A-Z/     将所有小写字符翻译为大写字母
$name =~/$pal/         在搜索字符串时使用变量