最近在研究一个
perl
项目,临时学习了一下perl语法,强行看项目源码。因为总是见到各种正则表达式后面接smxi
之类,虽然知道是匹配模式,但脑子里毫无概念。所以特地去学习了一下。
以上为背景。
Perl 正则表达式的匹配模式
先举个栗子:$var =~ s/regexp/place/smx
Perl正则表达式的匹配模式跟它的操作符有关。操作符主要就是m//
,s///
,tr///
三种。
-
m//
查找匹配,m可以省略-
i
忽略大小写,无需解释 -
s
在这个模式下.
可以匹配换行符\n
。也就是说如果你匹配的文本超过多行,而你有没有s
修饰符,那匹配到换行的时候就结束了。另外一个使用它的主要原因是
-
/s 修饰词同样还令 Perl 忽略我们已经不鼓励使用的 $* 变量,我们也希望你也忽略。
+m
令 ^ 和 $ 匹配下一个嵌入的 \n。我们举例子来说,有一个字符串Hello\nworld
,m/^wor|llo$/
匹配失败,而m/^wor|llo$/m
能匹配成功.
+x
忽略(大多数)空白并且允许模式中的注释。这个是最好玩的,你可以在正则里换行加空格加注释,尽情修饰。但是千万注意不要混入了你所使用的定界符
m{
\w+: # 匹配一个词和一个{冒号}。
}x;
#注意注释文字里的大括号。这个会报错
+ **`g`** 全局查找。通俗的说就是不加g匹配成功一次就会结束,加了g就会一直匹配查找直到结束。
-
s///
查找替换i
s
m
x
g
全局查`找替换。通俗的说就是不加g只会查找替换一次,加了g就会一直查找替换直到结束。-
e
表示第二个字符串是个可执行的(executable)表达式。废话少说上代码$replace = 'ABC';
$search = 'abcdef'; #$search =~ s/def/$replace.'DEF'/;
# abcABC.'DEF'
$search =~ s/def/$replace.'DEF'/e;
# abcABCDEF
-
tr///
转换。看起来跟上面2个差不多,实际上用法完全不一样.. 好吧,我也不是很明白,暂时没用上,点到为止。-
c
与SEARCHLIST为补。 -
d
删除找到的但是没有替换的字符 -
s
消除重复的字符。
-
========
一些perl正则的经典用法
$string = "password=xyzzy verbose=9 score=0";
%hash = $string =~ /(\w+)=(\w+)/g;
#%hash = (password => "xyzzy", verbose => 9, socre => 0);
$hobbit = 'Bilbo';
($lotr = $hobbit ) =~ s/Bilbo/Frodo/g;
# $lotr => 'Frodo'; 替换
# $hobbit => 'Bilbo'; 保持