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/ 在搜索字符串时使用变量