16. Perl 正则表达式-正则替换

    xiaoxiao2022-07-04  168

    正则表达式除了判断字符串是否匹配某个模式之外,也可以将匹配到的字符串进行替换.

    1. 正则替换语法

    默认正则表达式只替换一次默认正则表达式返回替换的次数

    1.1 简写语法

    简写方式就是对于内置变量$_ 进行正则替换操作简写方式常用语数组遍历中简写方式无须借助于绑定操作符 =~ # 设置内置变量的值 $_ = "hi,perl"; # 对内置变量$_ 进行替换 s/hi/hello/; print "$_\n";

    1.2 标准语法

    # 定义普通字符串 $str = "hi,perl"; # 对字符串进行替换 $str =~ s/hi/hello/; # 输出替换后的字符串 print "$str\n";

    1.3 自定义定界符

    正则替换也支持自定义定界符, 但是又有些不同,因为替换操作符需要用到三个符号。

    非成对的定界符: #匹配模式#替换内容#成对的定界符: {匹配模式}{替换内容} # 定义普通字符串 $str = "http://www.baidu.com"; # 对字符串进行替换 #str =~ s{http://}{https://}; $str =~ s#http://#https://#; # 输出替换后的字符串 print "$str\n";

    2. 替换修饰符

    2.1 正则修饰符

    正则替换表达式除了支持/s,/i,/x 修饰符之外,还支持 g, r 修饰符

    修饰符含义示例i忽略大小写s/ab/cd/i, 可将ab,AB等替换为cds默认元字符.无法匹配换行符\n, 添加s修饰后可匹配换行符s/a.b/ab/s,可将aeb,a\nb 替换为abx允许模式中添加空白符可在模式中任何位置添加任意多个空白符,增加模式的可读性. 但是需要注意的是,匹配空白符需要使用\sg全局替换, 默认只替换匹配的第一个s/l/L/g, 将所有的小写l替换为大写的Lr不替换原字符串,返回替换的新字符串。默认替换原串,返回替换次数$new = $str =~ s/l/L/r;

    2.2 替换模式特殊符号

    正则替换表达式除了支持正则匹配表达式中定义的元字符之外,还有一些额外的字符.

    元字符含义$nn为1,2,3…, 标识匹配模式捕获的第n个结果\l首字符小写, 其后仅跟的第一个字符小写\L其后所跟全部字符小写\u首字符大写, 其后紧跟的第一个字符大写\U其后所跟所有字符大写

    3. 返回结果

    对于正则替换, 默认返回替换的次数, 并会修改原字符串.对于添加修饰符/r的, 返回替换后的字符串, 不会修改原字符串

    3.1 返回替换数量

    $str = "hello,world"; $cnt = $str =~ s/l/L/g; # 输出结果- 替换次数: 3, 原字符串:heLLo,worLd print "替换次数: $cnt, 原字符串:$str \n";

    3.2 返回新字符串

    $str = "hello,world"; $new = $str =~ s/l/L/gr; # 输出结果- 原字符串: hello,world, 新字符串:heLLo,worLd print "原字符串: $str, 新字符串:$new \n";

    4. 综合示例

    4.1 正则返回全局替换次数

    # 定义普通字符串 $str = "Hello, I am a good boy!"; # 全局替换, 将小写o替换为大写O $cnt = $str =~ s/o/O/g; print "替换次数: $cnt \n"; print "替换后内容: $str \n";

    4.2 正则返回替换内容

    # 定义普通字符串 $str = "Hello, I am a good boy!"; # 正则替换, 不改变原串 $new = $str =~ s/Hello/hi/; print "原字符串: $str \n"; print "新字符串: $new \n";

    4.3 正则大小写替换

    # 定义普通字符串 $_ = "HELLO, I am a good boy!"; # 匹配值, 首字母小写。 替换结果:hELLO, I am a good boy! $str1 = s/(HELLO)/\l$1/r; # 匹配值, 全部小写。 替换结果:hello, I am a good boy! $str2 = s/(HELLO)/\L$1/r; # 匹配值, 首字母大写。 替换结果:HELLO, I am a Good boy! $str3 = s/(good)/\u$1/r; # 匹配值, 全部大写。 替换结果:HELLO, I am a GOOD boy! $str4 = s/(good)/\U$1/r;
    最新回复(0)