regex - 替换中的空白替换将匹配的字符串更改为空
问题描述
我正在尝试遵循一段代码。基本上,根据我的理解,这段代码不应该改变 $data 。我错过了什么吗?我正在使用 5.22.3(草莓 perl)。
use strict;
use warnings;
use 5.010;
my $data = 'we are here';
$data =~ s///g;
print "DATA1: $data\n";
$data =~ s{(we)}{
my $x1 = $1;
$x1 =~ s///g;
print "x1: ^^$x1^^\n";
"$x1"
}e;
print "DATA2: $data\n";
O/P-
DATA1: we are here
x1: ^^^^
DATA2: are here
解决方案
除非使用 by split
,否则空模式会告诉匹配/替换运算符使用最后一个模式来成功匹配。
例如,
$ perl -e'$_ = "abba"; s//c/g if /a/ || /b/; CORE::say;'
cbbc
这意味着
$x1 =~ s///g;
相当于
$x1 =~ s/(we)//g;
要绕过该异常,您可以使用
$x1 =~ s/(?:)//g;
说你的真实情况使用
$re = ...;
s/$re//g;
你可以使用
$re = ...;
s/(?:$re)//g;
或者
$re = ...;
$re = qr/$re/;
s/$re//g;
报价perlop ,
空模式 //
如果PATTERN计算结果为空字符串,则使用最后成功匹配的正则表达式。在这种情况下,只有空模式上的
g
和c
标志被接受;其他标志取自原始模式。如果之前没有匹配成功,这将(默默地)充当真正的空模式(它将始终匹配)。
推荐阅读
- scala - 我需要计算执行时间、成本、制造时间、等待时间等
- amazon-web-services - AWS Cognito Google 身份提供商获取个人资料名字和姓氏
- svg - 如何在 SVG 上设置宽度和高度属性
- c - 如何在字符串中间找到一个字符?
- android - 启用 Proguard 时 Retrofit2 不起作用
- if-statement - 使用 Google Sheet Script 的 If/Then 代码出现问题
- vue.js - 如何为第 3 部分 CSS 启用 PurgeCSS
- java - 有没有办法通过组件扫描查看注册了哪些 Bean?
- pandas - 从 15 个对象变量到最终目标变量(0 或 1)
- c# - 访问 ChromiumWebBrowser 属性时出现 WPF 和 Cefsharp 错误