2011-08-15 64 views
0

我解析HTML文檔..和我終於到哪裏,我需要檢查可能含有符號(1或多個)線的Perl /正則表達式來檢查公司符號

AAPL,GOOG,MSFT
AAPL
GE
GE,NVDA,IBM,CRM

正如你所看到的線條可以CONTA在一個或多個符號(由逗號分隔)..如何檢查線路以檢查是否符合上述標準? (即,檢查一個或多個符號是否在該特定線正被處理)

我的在它的第一刺 - 這似乎不工作(因爲所有的符號的線通常低於20個字符).. if($checkforcompanysymbol =~ m/^[a-z0-9]{0,20}$?/)

+0

如何從任何其他文字破譯的象徵? – vol7ron

+0

一個符號可以是1個字符(例如C)或最多4個(例如NSWA) – simbatish

+0

由於我在stema評論中的所有理由,我認爲你應該考慮改變選定的答案。 – vol7ron

回答

1

試試這個

^[A-Z]{1,4}(?:,\s?[A-Z]{1,4})*$ 

看到它online here on Regexr

^字符串

[A-Z]字符類的開始匹配,從範圍匹配任何字符AZ

[A-Z]{1,4}比賽1來自角色類別

的4個字符

(?:,\s?[A-Z]{1,4})*(?: ...)是一個非捕獲組,,\s?是一個逗號,後跟一個可選空白,1-4個字符,所有這0次或更多次(因爲*)。

$字符串

+0

工作就像一個魅力,非常好..謝謝 – simbatish

+0

**這不會工作** if (例如'APPL-GOOG-MSFT','APPL | GOOG | MSFT')或***不同情況***(例如'appl,goog,msft')或者*** ***沒有逗號***(例如'APPL GOOG MSFT')或分隔符前的***空格***(例如'APPL,GOOG,MSFT')或開頭的***空格*** (例如'APPL,GOOG,...') – vol7ron

+0

@ vol7ron,當然你是對的,這不適用於不同的分隔符**但是OP定義了分隔符是逗號**小有效點是領先的空間,但這將是一個非常簡單的方法修復這個問題。 – stema

0

不知道你的$?做底,但你可以嘗試:

m/\b\w{1,4}\b/ 

m/\b[a-zA-Z]{1,4}\b/ 

貌似it works for me

while (<DATA>){ 
    print "$..\t$_"; 

    my @matches = (/\b([a-zA-Z]{1,4})\b/g);  # can use \w instead of [a-zA-Z] 

    if (scalar(@matches)){ 
     print "\tMatched: [" 
      , join("\|" , @matches) 
      , "]\n\n" 
    } 
} 

__DATA__ 
A 
B 
C 
AAPL, GOOG, MSFT 
AAPL 
GE 
GE, NVDA, IBM, CRM 
X 
Y 
Z 
FOOBAR  
('GE, MSFT') 
+0

不工作,不知道爲什麼..這裏是一個字符串示例('GE,MSFT')..但你的正則表達式不會返回true :( – simbatish

+0

你確定嗎?它適用於我,[見示例](http ://codepad.org/vPcrBSju)我甚至使用了相同的確切字符串,並使用了'FOOBAR'作爲一個太長的情況 – vol7ron

1

(1)正在使用[A-Z0-9]字符類,它是小寫字母和數字0-9。公司的符號是大寫的。您可能想要使用[A-Z0-9]。

(2)您的量詞意味着至少次,但不超過20次。什麼公司名稱有0長度?您可能想要使用{1,20}(或更好地表徵公司名稱的其他數字)。

(3)我不確定您提供的正則表達式是否足以描述公司符號的特徵?例如,假設你考慮了(1)和(2),並且使用[A-Z0-9] {1,20}將匹配NOTACOMPANY,除非我錯了。如果是我,我只需要列出所有需要檢查的公司名單。

(4)您的正則表達式似乎不考慮逗號。

0

使用CSV模塊可能是矯枉過正該數據集的末尾匹配,但這裏有一個辦法做到這一點。增加了一個有點矯枉過正分類和計數,以及,爲了好玩:

代碼:

use strict; 
use warnings; 
use Text::CSV_XS; 

my $csv = Text::CSV_XS->new({ 
    allow_whitespace => 1, 
}); 

my @list; 
while (my $row = $csv->getline(*DATA)) { 
    for (@$row) { 
     push @list, $_ if /^\w{1,4}$/; 
    } 
} 

my %count; 
for (@list) { 
    $count{$_}++; 
} 

for (sort { $count{$b} <=> $count{$a} || $a cmp $b } keys %count) { 
    printf "%-6s %-3s\n", $_, $count{$_}; 
} 

__DATA__ 
A 
B 
some random line messing regexes up 
,, 
C 
AAPL, GOOG, MSFT 
AAPL 
GE 
GE, NVDA, IBM, CRM 
X 

輸出:

AAPL 2 
GE  2 
A  1 
B  1 
C  1 
CRM 1 
GOOG 1 
IBM 1 
MSFT 1 
NVDA 1 
X  1 
Y  1 
Z  1