文章目录

Perl 正则表达式:m// 与 s/// 操作

发布于 2026-04-06 11:46:50 · 浏览 12 次 · 评论 0 条

Perl 将正则表达式内建于语言核心之中,其中 m//(匹配)与 s///(替换)是最基础且最强大的两个操作符。掌握这两个工具,能高效解决文本查找、数据提取与内容修改问题。


一、 匹配操作符 m//

m// 用于检测字符串中是否包含特定模式。

  1. 执行 基本匹配。
    默认情况下,m 可以省略,直接使用斜杠包裹模式。操作符返回布尔值,常用于条件判断。

    my $text = "Hello World";
        if ($text =~ /World/) {
        print "匹配成功";
    }

    上述代码中,=~ 是绑定操作符,告诉 Perl 将右边的正则应用到左边的变量上。如果不指定变量,默认操作默认变量 $_`。 2. **使用** 匹配修饰符。 修饰符放在结尾斜杠之后,用于改变匹配行为。 | 修饰符 | 作用 | 说明 | | :--- | :--- | :--- | | `i` | 忽略大小写 | 匹配时不区分大写和小写字母。 | | `g` | 全局匹配 | 在字符串中查找所有匹配项,而非仅第一个。 | | `m` | 多行模式 | 让 `^` 和 `$ 匹配每行的开头和结尾。 |
    | s | 单行模式 | 让 . 也能匹配换行符。 |

  2. 提取 捕获组。
    在模式中使用括号 () 可以捕获匹配到的内容,捕获结果自动存入特殊变量 $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)时,使用默认斜杠作为定界符会导致代码难以阅读(需大量转义)。

  1. 更换 自定义定界符。
    m//s/// 支持使用任意成对或非成对字符作为定界符。若使用成对符号(如括号),则前后必须配对。

    # 使用默认斜杠(需转义,不推荐)
    $path =~ s\/usr\/bin\/usr\/local\/bin\;
    
        # 使用花括号作为定界符(清晰易读)
        $path =~ s{/usr/bin}{/usr/local/bin};
  2. 区分 绑定操作符。

    • =~:用于匹配或替换成功时返回真。
    • !~:用于匹配失败时返回真(仅用于 m//s/// 不支持 !~ 进行反向绑定操作)。
    my $line = "Error: Connection failed";
        # 如果不包含 "Success" 则打印错误
        if ($line !~ /Success/) {
        print "操作失败";
    }

四、 常见实战场景

  1. 清理 文本首尾空白。
    利用 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"

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文