需要正则表达式将所有双反斜杠转换为perl中的单反斜杠

时间:2014-03-06 10:45:27

标签: perl

我在字符串下面有一个字符串我正在使用正则表达式,但没有任何工作:

use strict;
use warnings;
my $var ="\\\\abc\\cde\\pqs\\some";
my $var1 = s/\\/\/;

$var =~ s/$var/$var1/;

print "$var\n";

目的是所有双反斜杠需要用单反斜杠改变。

5 个答案:

答案 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.