Perl 将正则表达式内建于语言核心之中,其中 m//(匹配)与 s///(替换)是最基础且最强大的两个操作符。掌握这两个工具,能高效解决文本查找、数据提取与内容修改问题。
一、 匹配操作符 m//
m// 用于检测字符串中是否包含特定模式。
-
执行 基本匹配。
默认情况下,m可以省略,直接使用斜杠包裹模式。操作符返回布尔值,常用于条件判断。my $text = "Hello World"; if ($text =~ /World/) { print "匹配成功"; }上述代码中,
=~是绑定操作符,告诉 Perl 将右边的正则应用到左边的变量上。如果不指定变量,默认操作默认变量$_`。 2. **使用** 匹配修饰符。 修饰符放在结尾斜杠之后,用于改变匹配行为。 | 修饰符 | 作用 | 说明 | | :--- | :--- | :--- | | `i` | 忽略大小写 | 匹配时不区分大写和小写字母。 | | `g` | 全局匹配 | 在字符串中查找所有匹配项,而非仅第一个。 | | `m` | 多行模式 | 让 `^` 和 `$匹配每行的开头和结尾。 |
|s| 单行模式 | 让.也能匹配换行符。 | -
提取 捕获组。
在模式中使用括号()可以捕获匹配到的内容,捕获结果自动存入特殊变量$1`、`$2等变量中,变量编号取决于括号出现的顺序。my $data = "Date: 2023-10-01"; if ($data =~ /Date: (\d{4})-(\d{2})-(\d{2})/) { print "年份: $1, 月份: $2, 日期: $3"; } ``` --- ### 二、 替换操作符 `s///` `s///` 用于查找并替换字符串中的内容,格式为 `s/模式/替换内容/`。 1. **执行** 基本替换。 默认情况下,`s///` 只替换第一个匹配到的内容。 ```perl my $str = "apple banana apple"; $str =~ s/apple/orange/; # 结果: "orange banana apple" ``` 2. **应用** 全局替换修饰符 `g`。 若需替换所有匹配项,必须在结尾添加 `g` 修饰符。 ```perl my $str = "apple banana apple"; $str =~ s/apple/orange/g; # 结果: "orange banana orange" ``` 3. **利用** `e` 修饰符执行代码。 添加 `e` 修饰符后,替换部分不再是普通字符串,而是可执行的 Perl 表达式。这在需要动态计算替换值时非常有用。 ```perl my $num = "price: 100"; # 将数字乘以 2 $num =~ s/(\d+)/$1 * 2/e; # 结果: "price: 200"
三、 定界符与绑定操作符
当正则表达式中包含大量斜杠(如处理文件路径或 URL)时,使用默认斜杠作为定界符会导致代码难以阅读(需大量转义)。
-
更换 自定义定界符。
m//和s///支持使用任意成对或非成对字符作为定界符。若使用成对符号(如括号),则前后必须配对。# 使用默认斜杠(需转义,不推荐) $path =~ s\/usr\/bin\/usr\/local\/bin\; # 使用花括号作为定界符(清晰易读) $path =~ s{/usr/bin}{/usr/local/bin}; -
区分 绑定操作符。
=~:用于匹配或替换成功时返回真。!~:用于匹配失败时返回真(仅用于m//,s///不支持!~进行反向绑定操作)。
my $line = "Error: Connection failed"; # 如果不包含 "Success" 则打印错误 if ($line !~ /Success/) { print "操作失败"; }
四、 常见实战场景
- 清理 文本首尾空白。
利用s///结合^和 `$` 锚点。 ```perl my $input = " data ";去除首部空白
$input =~ s/^\s+//; # 去除尾部空白 $input =~ s/\s+$//; ``` 2. **交换** 变量位置。 利用捕获组在替换字符串中引用 `$1
和$2`。 ```perl my $names = "Doe, John";将 "姓, 名" 改为 "名 姓"
$names =~ s/(\w+),\s+(\w+)/$2 $1/; # 结果: "John Doe" ``` 3. **过滤** 特殊字符。 在处理用户输入时,常需移除非字母数字字符。 ```perl my $raw = "User@Input#123";
将非字母数字下划线的字符替换为空
$raw =~ s/\W//g;
结果: "UserInput123"

暂无评论,快来抢沙发吧!