2013-07-24 128 views
1

我需要區分具有單反斜槓和雙反斜槓的字符串。 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 

即它匹配雙反斜線單之一。

能否請你幫我的正則表達式匹配雙而不是單反斜線?

+0

嘗試:'/^\\(?:[^ \\] | $)/' – shawnhcorey

+0

謝謝!負面看法是我的問題的答案。 –

回答

6

在Perl中,單引號字符串中只有兩個反斜槓:

  1. 分隔符,例如'John\'s car'
  2. 反斜線。這是必要的,當我們想要一個尾部反斜槓:'foo\bar\\'

所有其他反斜槓是文字。不幸的後果是,對於n實際反斜槓,或者是2n-12n反斜槓必須用在單引號字符串中。

的正則表達式具有相同的反斜線語義雙引號的字符串。

你已經擁有一個領先的雙反斜線匹配的正則表達式:/^\\\\/。這顯然不會匹配單個主要的反斜槓。

如果你想匹配一個反斜槓,只有一個反斜槓,只需確保第一反斜槓後面沒有另外一個。這使用了負面預測:/^\\(?!\\)/

+1

heredocs的單引號變體計數不同:* n *反斜槓總是* n *反斜槓。這可以讓你徹底擺脫惱人的逃跑。例子'print <<'';␤\\\\␤␤'將打印4個反斜槓。 – daxim

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 
+0

你可能想編輯你的答案來解釋*你正在做什麼,以及你爲什麼這樣做。 (另請注意,坦率地說,你的正則表達式是廢話你大概意思'/ ^(\\ *)/'與您正則表達式例如,如果我有文字輸入'\\:。foobar',在'$ 1'捕獲會等於'「\\\\:」',給出長度* 4 *。您不希望量化'.',而是''\\''。另外,'/...[az]+/i'很荒謬,你是不是指'\ w +'?) – amon

相關問題