Perl正则表达式之模式匹配
2015-05-13 22:06 西风狂诗曲 阅读(3278) 评论(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/ 在搜索字符串时使用变量