如何在单引号字符串中匹配双反斜杠?

时间:2013-07-24 22:05:03

标签: regex perl

我需要区分字符串与单反斜杠和双反斜杠。 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

即。它匹配双反斜杠作为单一反斜杠。

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

2 个答案:

答案 0 :(得分:6)

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

  1. 分隔符,例如'John\'s car'
  2. 反斜杠。当我们想要一个尾随反斜杠时,这是必要的:'foo\bar\\'
  3. 所有其他反斜杠都是字面的。不幸的结果是,对于 n 实际反斜杠, 2n-1 2n 反斜杠必须在单引号字符串文字中使用

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

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

    如果要匹配单个反斜杠和仅一个反斜杠,只需确保第一个反斜杠后面没有另一个反斜杠。这使用了负前瞻:/^\\(?!\\)/

答案 1 :(得分: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