2016-03-22 23 views
1

SO üzerinde good discussionsregular expressions and empty lines zaten vardır. Yinelenen bu soruyu kaldırırım.Boş ve boş satırlar arasındaki farklar regexps içinde

Bu betiğin neden 4 3 4 4 4 3 yerine 5 3 4 5 4 3 çıktısını açıklayabilir misiniz? $blank ve $classyblank hata ayıklayıcısında çalıştırdığımda, yazdırma deyiminin hemen öncesine kadar "4" (doğru değer olduğunu varsayar) kalır.

my ($blank, $nonblank, $non_nonblank, 
    $classyblank, $classyspace, $blanketyblank) = 0 ; 

while (<DATA>) { 

    $blank++ if /\p{IsBlank}/   ; # POSIXly blank - 4? 
    $nonblank++ if /^\P{IsBlank}$/ ; # POSIXly non-blank - 3 
    $non_nonblank++ if not /\S/  ; # perlishly not non-blank - 4 
    $classyblank++ if /[[:blank:]]/ ; # older(?) charclass blankness - 4? 
    $classyspace++ if /^[[:space:]]$/ ; # older(?) charclass whitespace - 4 
    $blanketyblank++ if /^$/   ; # perlishly *really empty* - 3 

} 

print join " ", $blank, $nonblank, $non_nonblank, 
      $classyblank, $classyspace, $blanketyblank , "\n" ; 

__DATA__ 

line above only has a linefeed this one is not blank because: words 

this line is followed by a line with white space (you may need to add it) 

then another blank line following this one 

THE END :-\ 

o __DATA__ bölüm ile ilgili bir şey ya da ben POSIX normal ifadelerini yanlış anlama am mı?


ps: zamanında yazı elsewhere üzerine yorumunda belirtildiği gibi

, "Gerçekten boş" (/^$/) olmayan boşluğu kaçırabilir:

perl -E 'my $string = "\n" . "foo\n\n" ; say "empty" if $string =~ /^$/ ;' 
perl -E 'my $string = "\n" . "bar\n\n" ; say "empty" if $string =~ /\A\z/ ;' 
perl -E 'my $string = "\n" . "baz\n\n" ; say "empty" if $string =~ /\S/ ;' 
+0

Daha sonra farklı dillerde [python hariç, ancak Tamam] oldukça tutarlı olan if/\ A \ Z/'ve' if/\ A \ z/'... var (http://stackoverflow.com/ sorular/7063420/perl uyumlu-düzenli-ifade-pcre-in-piton). –

+0

'Bu perl 5, sürüm 22, subversion 0 (v5.22.0) amd64 freebsd' –

+1

için oluşturulmuştur. Temel sorunuzla ilgili değil, '$ string = "\ n", "foo \ n \ n" ' "$ string" için tek bir yeni satır atar. Geri kalanlar virgül operatöründen dolayı atılır. – ThisSuitIsBlackNot

cevap

2

/\p{IsBlank}/ kontrol etmez boş bir dize için. \p, belirtilen Unicode özelliğine sahip bir karakterle eşleşir.

$ unichars '\p{IsBlank}' | cat 
---- U+0009 CHARACTER TABULATION 
---- U+0020 SPACE 
---- U+00A0 NO-BREAK SPACE 
---- U+1680 OGHAM SPACE MARK 
---- U+2000 EN QUAD 
---- U+2001 EM QUAD 
---- U+2002 EN SPACE 
---- U+2003 EM SPACE 
---- U+2004 THREE-PER-EM SPACE 
---- U+2005 FOUR-PER-EM SPACE 
---- U+2006 SIX-PER-EM SPACE 
---- U+2007 FIGURE SPACE 
---- U+2008 PUNCTUATION SPACE 
---- U+2009 THIN SPACE 
---- U+200A HAIR SPACE 
---- U+202F NARROW NO-BREAK SPACE 
---- U+205F MEDIUM MATHEMATICAL SPACE 
---- U+3000 IDEOGRAPHIC SPACE 

UZAY ISBLANK özelliğine sahiptir çünkü " \n" eşleşir. Boş bir dizeyi denetlemiyor. [...], belirtilen sınıfın üyesi olan bir karakterle eşleşir.

$ unichars '[[:blank:]]' | cat 
---- U+0009 CHARACTER TABULATION 
---- U+0020 SPACE 
---- U+00A0 NO-BREAK SPACE 
---- U+1680 OGHAM SPACE MARK 
---- U+2000 EN QUAD 
---- U+2001 EM QUAD 
---- U+2002 EN SPACE 
---- U+2003 EM SPACE 
---- U+2004 THREE-PER-EM SPACE 
---- U+2005 FOUR-PER-EM SPACE 
---- U+2006 SIX-PER-EM SPACE 
---- U+2007 FIGURE SPACE 
---- U+2008 PUNCTUATION SPACE 
---- U+2009 THIN SPACE 
---- U+200A HAIR SPACE 
---- U+202F NARROW NO-BREAK SPACE 
---- U+205F MEDIUM MATHEMATICAL SPACE 
---- U+3000 IDEOGRAPHIC SPACE 

UZAY böylece [:blank:] POSIX karakter sınıfı üyesi ve [[:blank:]] karakter sınıfının bir üyesidir çünkü " \n" eşleşir.

+0

Teşekkürler, grok için başlıyor ... $/$ olmayan/\ P {IsBlank}/'(çapa olmadan) bana" 8 "(' __DATA__' 8 satır var) veriyorsa, '\ n' olarak sayıyor non-'{IsBlank}' ('\ P' nedeniyle) ve dolayısıyla 8 maçı görüyor. Ardından,/^ \ P {IsBlank} $/'olarak artırma, boş olmayan yatay karakterlerin (' \ n') üç satırını temel alır, böylece "3" olur. Ancak '/ \ p {IsBlank}' bana "5" sayısını verir, çünkü "\ s" stili yatay "boş karakterler" olan beş satır vardır: dördü metin (ve kelimeler arasındaki boşluk) ve satır sayısı 5 boş bir satır olarak görünecek "" "\ n. –

İlgili konular