1. 用m//进行匹配
- 正则表达式完整的写法是:m/ / (m表示match),与qw/ /类似。
- 界定符可以自行选择。但/使用 /时,m可以省略,并且定界符要选模式中不会出现的字符。
2. 模式匹配修饰符
修饰符:正则表达式末尾可以追加一些修饰用的字符,用以调整模式的匹配行为。
- 用/i进行大小写无关的匹配
- 用/s匹配任意字符
点号.无法匹配换行符,希望.能匹配换行符,可以加/s修饰符。
- 用/x加入辅助空白字符
/x修饰符允许我们在模式里随意加上空白字符,使得它更易阅读和理解
如
/-?[0-9]+\.?[0-9]*/
/ -? [0-9]+ \.? [0-9]* /x
- 联合使用修饰符
如果要对单词匹配使用多项修饰符,只需要把它们连接在一起写在末尾,顺序无关紧要。
if (/barney.*fred/is) { # 同时使用/i 和/s
- 选择字符的解释方式
/a: 对字符集采取ASCII方式解释
/u: 以Unicode方式解释
/l: 根据本地化语言的设定,用对应的字符集编码做解释
- 行首和行尾锚位
修饰符/m会改变锚位的行为。
/fred$/m:找出行末出现fred的字符串
/^barney/m:匹配字符串开头位置和换行符之后的位置
- 其他选项
3. 绑定操作符 =~
正侧表达式默认匹配的目标文本时$_。
如果要指定匹配某个变量中的文本,可以在绑定操作符=~的左侧写上变量,右侧写上正则表达式。
4. 捕获变量
正则表达式里的圆括号()一般都会触发正则引擎捕捉匹配到的字符串。
捕获组会把匹配括号中模式的字符串保存到相应变量。
每个捕获组包含的都是原始字符串中的内容,而不是模式本身,实质上时标量变量。在Perl里面他们是2这样的形式。
模式中有多少个捕获括号就有多少个对应名字的捕获变量。
- 捕获变量的存续期
捕获变量的内容一般会保持到下次成功匹配位置。
- 禁用捕获的括号
只分组禁用捕获:?:
- 命名捕获
(?<LABEL自行命名>PATTERN)
- 自动捕获变量
&里
`里
$':保存了字符串中剩下的从未被匹配到的部分
5. 优先级
- 顶端:括号 用于分组和捕获
- 第二级:量词( * + ?)
- 第三级:锚位(\A、\Z、\z、^、$、\b、\B)和字符序列
- 第四级:择一竖线(|)
- 最低级:原子(单独字符,字符集合和反引用)
正则表达式特性 | 示例 |
---|---|
圆括号 | (...), (?:...), (?<LABEL>...) |
量词 | a*, a+, a?, a{n,m} |
锚位和字符序列 | abc, ^, $, \A, \b, \z, \Z |
择一 | 竖线 |
原子 | a,[abc], \d, \1, \g{2} |
- 优先级示列 (略)
- 还有更多 (略)
6. 模式测试程序
下面这个程序可以用于检测某些字符串是否能被指定模式匹配以及在什么位置上匹配:
while (<>) { #每次读一行输入
chomp;
if (/ YOUR_PATTERN_GOES_HERE/) {
print "Matched: |$`<$&>$'|\n"; #特殊捕获变量
} else {
print "No match: |$_|\n";
}
}
网友评论