<pre name="code" class="sql"> 下面的就是这些字符:
| ( ) { ^ $ * + ? .
反斜杠本身是一个元字符,因此如果你要匹配一个文本的反斜杠,你要在反斜杠前面放一个反斜杠:\
反斜杠(平时正常) 的字母数字字符作用相反,它把该文本字符变成某些特殊的东西。无论什么时候你看到下面的双字符序列:
/(bar){3}/ 这样将和"barbarbar"匹配
redis01:/root/big# cat a1.pl
$var='barbarbar11';
if ($var =~/(bar){3}/){print "11111
";};
redis01:/root/big# perl a1.pl
11111
5.2 模式匹配操作符:
m// 用于匹配一个模式 (如果把斜杠用做分隔符,你可以把m// 写成//,不用写m.)
$haystack =~ m/meedle/ # 匹配一个简单模式
$haystack =~ /needle/ # 一样的东西
redis01:/root/big# cat a2.pl
$var='meedlexx1';
if ($var =~ m/meedle/){print "11111111
"};
if ($var =~ /meedle/){print "22222222
"};
redis01:/root/big# perl a2.pl
11111111
22222222
每次成功匹配了一个模式(包括替换中的模式),操作符都会把变量$`, $&和$' 分配设为为匹配内容左边内容,
匹配的内容和匹配内容的右边的文本。这个功能对于把字符串分解为组件很有用:
为了有更好的颗粒度和提高效率,你可以用圆括弧捕捉你特别想分离出来的部分. 每对圆括弧捕捉与圆括弧内的模式相
匹配的子模式。圆括弧有左圆括弧的位置从左到右依次排序:对应那些子模式的子字串在匹配之后可以通过
顺序的变量$1,$2,$3 等等获得:
$`,$&,$' 和排序的变量都是全局变量,它们隐含地局部化为属于此闭合的动态范围。
它们的存在直到下一次成功的匹配或者当前范围的结尾,以先到者为准。
一旦Perl 认为你的程序的任意部分需要$`,$&或$',它就会为每次模式匹配提供这些东西。
这样做会微微减慢你的程序的速度。Perl 同样还利用类似的机制生成$1,$2 等等,
因此你也会为每个包含捕捉圆括弧的模式付出一些代价。
5.2.1 模式修饰词:
修饰词 含义
/i 忽略字母的大小写(大小写无关)
/s 令.匹配换行符并且忽略不建议使用的$*变量
通常.元字符"." 匹配除了换行符以外的任何单个字符,因为它的传统含义是匹配一行内的某个字符。
不过,带有/s时,"." 元字符也可以匹配一个换行符,因为你已经告诉Perl 忽略该字符串可能包含多个换行符的情况
redis01:/root/big# cat a3.pl
$var="abc
efg
123";
if ($var =~/abc.efg/){print "111111111
"};
if ($var =~/abc.efg/s){print "22222222
"};
redis01:/root/big# perl a3.pl
22222222
让.号可以匹配
/m 令^和$匹配下一个嵌入的
5.2.2 m// 操作符(匹配)
m// 操作符搜索变量EXPR 里面的子串,查找PATTERN 。如果使用/或?做分隔符,那么开头的m是可选的。
? 表示只匹配前者一次:
5.2.3 s/// 操作符(替换)
5.2.3.1 顺便修改一下子串:
s/^s+//; # 丢弃开头的空白
s/s+$//; # 丢弃结尾的空白
s/s+/ /g; # 压缩内部的空白
5.3 元字符和元符号:
到现在你应该已经看到这样的事实,就是这些符号并不是普通的函数调用或者算术操作符,正则表达式本身就是嵌入Perl的小型语
言。
5.3.1 元字符表:
符号 原子性 含义
... 变化 反逃逸下一个非字母数字字符,转义下一个字母数字(可能)
...|... 否 可选(匹配前者或者后者)
(...) 是 分组(当作单元对待)
至于量词,我们会在它们自己的章节里详细描述,量词表示前导的原子(也就是说,单字符或者分组)应该匹配的次数,它们列在表
5-5中。
表5-5 ,正则量词:
量词 原子性 含义
* 否 匹配0或者更多次数(最大)
+ 否 匹配或者更多次数(最大)
? 否 匹配1或者0次
5.3.3 通配元符号:
点号元字符常和量词一起使用。.* 匹配尽可能多的字符,而.*? 匹配尽可能少的字符。
5.4.3 Unicode 属性: