2013-11-14 112 views
1

所以我有一個正則表達式只想查找2個單詞 - 只有一個單詞在一行會出錯,超過三個單詞會踢出來,給我一個行號(這是我想要的)。

#!/usr/bin/perl 
use warnings 
use strict 

open(my $filehandle ,"<", "/tmp/compare.cleartxt.tmpusers") || die "cant access the file" ; 
    while (<$filehandle>) { 
     if ($_ !~ /^\w+\s\w+$/) { 
     print "LINE $., error on $_ " ; 
     } 
} 

問題是這些詞中的一些包含「$」符號。 像

LINE 700, error on ubs$iontest ubs$iontest 
LINE 904, error on uho$jptest uho$jptest uho$jptest 
LINE 1929, error on boa$jgb boa$jgb 
LINE 2976, error on mitadel mitadel mitadel$001 
LINE 3205, error on csfb csfb csfb$jpntest csfb$001 csfb$nytest 
LINE 4762, error on mitsi$jgb2 mitsub$jgb2 
LINE 6346, error on GOLDSTPTG GOLDSTPTG GOLDSTPTG 
LINE 6660, error on jptest mizuho$jptest jptest 

,因此我想讓線700或1929年擺脫誤報一樣,但使用這種保持像行錯誤904

我累了,但它提出了很多更多的錯誤,喜歡它每一張打印的話,在它像「foo_bar這樣」一個下劃線

if ($_ !~ /^[a-zA-Z$0-9]+\s[a-zA-Z$0-9]+$/) 
+3

什麼'/^\ S + \ S \ S + $ /' – hwnd

+0

你有沒有考慮處理之前剝離非單詞字符? – abiessu

+1

將'\ w'替換爲'[\ w $]'(您可能需要將'$'轉義爲'\ $',但我不認爲是這種情況)。 – iamnotmaynard

回答

4

\w因爲$不被視爲一個單詞字符不匹配$

它看起來像你想匹配的東西,在Perl而言,是要麼單詞字符一個$字符。

嘗試用[\w\$]代替\w。 (你需要躲避$所以它不會把$]作爲變量參考。)

如果你想匹配的非空白字符序列,\S將匹配任何單個非空白字符。包括所有單詞字符和$;它還包含其他標點符號。

我只注意到別的東西,你在你的問題中寫道:

使用該

我累了,但它提出了很多更多的錯誤,就像它印 每一個單詞,它像「foo_bar這樣的名稱」的下劃線。

Perl的一個 「單詞字符」 的定義是:

字母加 「_」,再加上其他連接符標點字符加上統一標誌着

所以下劃線_是視爲單詞字符。這聽起來像你想匹配字母和$,但不是_。數字呢?其他標點符號?重音和非拉丁字母?

一旦你指定剛好你想要匹配什麼,那麼構造一個可以完成這個工作的正則表達式會容易得多。

有關Perl正則表達式的更多信息,請參閱here或嘗試perldoc perlre

+0

Downvoter:此答案的初始版本中存在錯誤(您可能已指出)。我相信現在是正確的。請再看看您是否碰巧看到此評論。 –

+0

perl正則表達式的獨特之處在於需要'$'在字符類中轉義嗎? –

+0

@hwnd:不,但是'/.../'中的文本確實應用了可變插值。一個快速實驗表明'$ s =〜/([\ w $] *)/'產生一個抱怨「不匹配[在正則表達式中],但'$ s =〜/([\ w \ $] *)/' 。有趣的是'$ s =〜/ foo $ /'沒有這個問題。 –

1

您可以使用:

/^[\w$]+\s[\w$]+$/