用正则表达式进行匹配
##用m//进行匹配
m//可以任意符号作为定界符 与qw类似 而使用//可以省略m
经常使用花括号{}作为定界符
#模式匹配修饰符
要写在//后面 如//i //s等
/i大小写无关匹配
/s匹配任意字符 点号“.”原本不匹配换行符,/s可使点号匹配任何字符
/x忽略空格,方便阅读
如/-?[0-9]+\.?[0-9*]/不方便阅读
若使用/x 则/-? [0-9]+ \.? [0-9*]/x
或\
-?
[0-9]+
\.?
[0-9]*
\x
#组合选项修饰符
连在一起写在末尾 如//isx
#锚位
正则默认从字符串开头读取,若未匹配成功,则会在下一个字符继续尝试
"\A"绝对开头读取
"\Z"绝对末尾读取
且都不会继续尝试
#单词锚位
每个单词的锚位
单词锚位可写为\b
\b可以加在/ /的头尾
也可以这样写/(\b \b) /
#绑定操作符=~
之前正则表达式只能匹配默认变量$_
$everything=~/ / 可匹配任何变量
#模式中的内插
#捕获变量
在用括号捕获字符串后,可以用 $1 $2 $3 $4 等变量表示出来
$_="hello my,neighbor"
if(/(\s+)(\s+),(\s+)/){
print"words are $1 $2 $3"; #结果为hello my neighbor
}
#捕获变量的存活期
只有在匹配成功后才会覆盖掉之前匹配的值,若失败则不会改变
$cap="123";
$cap=~/([0-9]+)/; #匹配成功 $1等于123
$cap=~/([a-zA-Z])+/; #匹配失败 $1不改变 还是123
#不捕获模式
若不需要捕获变量,仅为了分组为整体字符串
可以写为(?:内容) 来表示不需要捕获
#命名捕获
因通过 $1 $2 $3 不容易分辨,则可以给捕获组命任意名字
写法为(?<名字>捕获内容) 而提取变量时写法为$+{名字}
#自动捕获变量
三个无需括号捕获的“免费”提取变量
分别是 $& $` $'
匹配区间中的内容存到 $& 内
匹配区间前的内容存到 $` 内
匹配区间后的内容存到 $' 内
#通用量词
之前提到过 * + ? 这三个量词,若不满足使用则
还有一种量词 花括号{}
{3}表示为只能出现三次
{3,}表示为能出现三次或三次以上
{,3}表示为能出现三次或三次以下
#优先级
操作优先级
#模式测试程序
while(<>){
chomp;
if(/匹配内容/){
print"|$`<$&>$'|\n";
}else{
print"no match";
}
}
以上这个程序可以检测字符串能否被匹配以及在什么位置上被匹配
匹配位置在尖括号< >中
浙公网安备 33010602011771号