我在字符串下面有一个字符串我正在使用正则表达式,但没有任何工作:
use strict;
use warnings;
my $var ="\\\\abc\\cde\\pqs\\some";
my $var1 = s/\\/\/;
$var =~ s/$var/$var1/;
print "$var\n";
目的是所有双反斜杠需要用单反斜杠改变。
答案 0 :(得分:1)
#!/usr/bin/perl -w
use strict;
use warnings;
my $var ="\\\\abc\\cde\\pqs\\some";
$var =~ s|\\{2}|\\|g;
print "$var\n";
答案 1 :(得分:0)
要用一个替换两个黑色斜杠,您可以使用这个简单的正则表达式:
$var =~ s/\\\\/\\/g;
这将进行对话,但结果可能不符合您的预期。
我认为你真正试图做的是:
#!/usr/bin/perl -w
my $demo = "\\\\\\\\abc\\\\cde\\\\pqs\\\\some";
$demo =~ s/(^|[^\\])\\{2}($|[^\\])/$1\\$2/g;
$demo =~ s/(^|[^\\])\\{4}($|[^\\])/$1\\\\$2/g;
print "Result: $demo\n";
我认为你有一个包含反斜杠的转义字符串,如下例所示:
\\\\server\\path\\path\\path
你想把它变成这个:
\\server\path\path\path
然后你必须使用上面例子中显示的“两步”正则表达式。
首先,它是一个“搜索/替换”正则表达式:
s/.../.../g
最后的g
表示“全局匹配”。这实际上意味着,在第一次匹配和替换之后,进一步搜索字符串以寻找更多匹配,直到找到并替换所有匹配。这是如何工作的,这就是为什么我的例子中的正则表达式可能需要理解:
如果我们有这样的字符串:
heeeello
你应用这样的正则表达式:
s/ee/e/g
你实际上得到了这个结果:
hello
这是因为ee
匹配了好几次。在下面的示例中,我以大写形式编写匹配的字符:
hEEeello -> hEeello
hEEello -> hEello
hEEllo -> hEllo
no match left.
这是我正则表达式中额外位的原因。在第一个中,我搜索具有正好2 反斜杠的地方,并将其替换为一个。在第二个正则表达式中,我搜索带有正好4个反斜杠的地方,并将其替换为两个。
让我们看一下搜索部分:
(^|[^\\])\\{2}($|[^\\])
(^|[^\\])
这实际上是一个捕获组(...|...)
。实际上它匹配 ^
=文本的开头,或 [^\\]
不是反斜杠字符。
\\{2}
这恰好与{2}
两个反斜杠字符匹配。
($|[^\\])
这与第一组类似。这意味着:匹配 $
=文字的结尾,或 [^\\]
=不是反斜杠字符。
第二个正则表达式类似,但它使用\\{4}
来恰好匹配四个反斜杠。
此[^\\]
匹配不反斜杠字符部分是必要的,以避免上面“hello”示例中显示的行为。
此示例字符串:
\\\\\\\\\\\\\a
简单不匹配。
答案 2 :(得分:0)
您正在为$var1
分配正则表达式,然后将其放入另一个正则表达式的替换部分中 - 这不起作用。此外,正则表达式需要使用g
修饰符来替换所有匹配项,而不仅仅是第一个匹配项。
use strict;
use warnings;
my $var ="\\\\abc\\cde\\pqs\\some";
$var =~ s/\\\\/\\/g;
print "$var\n";
答案 3 :(得分:0)
use strict;
use warnings;
my $var = "\\\\abc\\cde\\pqs\\some";
$var =~ s/\\{2}/\\/g;
print "$var\n";
答案 4 :(得分:0)
实际上有一个更复杂但更简单的解决方案:
#!/usr/bin/perl -w
my $demo = "\\\\\\\\abc\\\\cde\\\\pqs\\\\some";
$demo =~ s/(?:^|[^\\])(\\+)(?:$|[^\\])/{'\\' x (length("$1")\/2)}/ge;
print "Result: $demo\n";
这是在替换部分中使用一个表达式,它只是将找到的反斜杠字符数除以2.