2

我需要区分带有单反斜杠和双反斜杠的字符串。Perl 平等对待它们:

print "\n" . '\qqq\www\eee\rrr';
print "\n" . '\\qqq\www\eee\rrr';

将给出相同的结果:

\qqq\www\eee\rrr
\qqq\www\eee\rrr

更重要的是,下一个电话:

print "\n" . leadingBackSlash('\qqq\www\eee\rrr');
print "\n" . leadingBackSlash('\\qqq\www\eee\rrr');
print "\n" . leadingBackSlash('\\\qqq\www\eee\rrr');
print "\n" . leadingBackSlash('\\\\qqq\www\eee\rrr');

发挥作用:

sub leadingBackSlash {
    $_ = shift;
    print "\n$_";
    print "\n" . length($_);

    if( m/^\\\\/) {
        print "\ndouble backslash is matched";
    }

    if( m/^\\/) {
        print "\nsingle backslash is matched";
    }
}

将产生结果:

\qqq\www\eee\rrr
16
single backslash is matched

\qqq\www\eee\rrr
16
single backslash is matched

\\qqq\www\eee\rrr
17
double backslash is matched
single backslash is matched

\\qqq\www\eee\rrr
17
double backslash is matched
single backslash is matched

即它将双反斜杠匹配为单个反斜杠。

你能帮我用正则表达式匹配双反斜杠而不是单反斜杠吗?

4

2 回答 2

7

在 Perl 中,单引号字符串只有两个反斜杠转义:

  1. 分隔符,例如'John\'s car'.
  2. 反斜杠。当我们想要尾部反斜杠时,这是必要的:'foo\bar\\'

所有其他反斜杠都是文字。这样做的不幸后果是,对于n 个实际的反斜杠,必须在单引号字符串文字中使用2n-12n 个反斜杠。

正则表达式与双引号字符串具有相同的反斜杠语义。

您已经有一个与前导双反斜杠匹配的正则表达式:/^\\\\/. 这显然不会匹配单个前导反斜杠。

如果您想匹配一个反斜杠,并且只匹配一个反斜杠,只需确保第一个反斜杠后面没有另一个反斜杠。这使用了否定的前瞻:/^\\(?!\\)/.

于 2013-07-24T22:10:10.513 回答
0
#!usr/bin/perl -w
use strict;

#Give the STDIN from the commandline and you will get the exact output

chomp (my $string = <STDIN>) ; # Input: \\\arun
print "\$string: ".$string,"\n";
if($string =~m/^(\\.*?)[a-z]+/i){print "Matched backslash ".length ($1)."
times in the string ".$string."\n";}

my $string2 = '\\\arun';
print "\$string2: ".$string2,"\n";


=h
output:

Inputgiven:\\\arun
$string: \\\arun
Matched backslash 3 times in the string \\\arun
$string2: \\arun
于 2013-07-25T00:22:18.280 回答