2013-03-20 35 views
1

我正在尋找一個perl正則表達式,它將驗證只包含字母ACGT的字符串。例如,「AACGGGTTA」應該是有效的,而「AAYYGGTTA」應該是無效的,因爲第二個字符串的「YY」不是A,C,G,T字母之一。我有以下的代碼,但它證實了上述兩個字符串如何驗證一個字符串只有一定的字母由perl和正則表達式

if($userinput =~/[A|C|G|T]/i) 
{ 
    $validEntry = 1; 
    print "Valid\n"; 
} 

感謝

+0

你真的想用/ i嗎,允許大寫還是小寫? – ysth 2013-03-20 04:09:42

回答

3

使用字符類,並確保你使用字符串的開始標記檢查整個字符串,\A和結束的字符串標記,\z

你也應該使用*+,表示你要多少字符匹配 - 「一個或多個」 *手段「零個或多個」和+手段

因此,正則表達式下面稱「起動與(不區分大小寫)串的端部之間,應該有以下字符僅一個或多個:A,C,G,T」

if($userinput =~ /\A[acgt]+\z/i) 
{ 
    $validEntry = 1; 
    print "Valid\n"; 
} 
+0

默認情況下'$'匹配字符串的末尾或字符串末尾的換行符,因此您的正則表達式匹配具有換行符的字符串。要僅匹配字符串的結尾,請使用'\ z' – ysth 2013-03-20 04:07:45

+0

當然。問題中沒有提到如何處理多行字符串的任何特定要求;因此在沒有更多信息的情況下,這兩種實施似乎都是有效的 – 2013-03-20 20:43:57

+2

我認爲「驗證只包含字母ACGT的字符串」非常明確 – ysth 2013-03-20 20:48:08

4

您的角色等級[A|C|G|T]包含||不代表角色類別的變化,它只代表自己。因此,字符類將包括|字符,這不是你想要的。

您的圖案不固定。模式​​可以匹配任何包含一個或多個這些字符的字符串。相反,您需要錨定您的模式,以便只匹配從開始到結束僅包含這些字符的字符串。

$可以匹配一個換行符。爲了避免這種情況,最後使用\z來錨定。 \A錨開頭(雖然你是否使用或^在這種情況下,使用\A提供了一個很好的對稱性不會有所作爲

所以,你檢查應該寫成:

if ($userinput =~ /\A [ACGT]+ \z/ix) 
{ 
    $validEntry = 1; 
    print "Valid\n"; 
} 
4

使用字符計數TR運營商:

if($userinput !~ tr/ACGT//c) 
{ 
    $validEntry = 1; 
    print "Valid\n"; 
} 

tr/characterset//計數字符串中的字符如何在字符集;與/c標誌,它計算多少在字符集中是而不是。如果使用!~而不是=~否定結果,那麼如果沒有字符不在字符集中,則爲true;如果字符不在字符集中,則爲true。

相關問題