如何通过perl和regex验证字符串只包含某些字母

时间:2013-03-20 02:52:28

标签: regex perl

我正在寻找一个perl正则表达式,它将验证只包含字母ACGT的字符串。例如" AACGGGTTA"应该是有效的" AAYYGGTTA"应该是无效的,因为第二个字符串有" YY"这不是A,C,G,T字母之一。我有以下代码,但它验证了上述字符串

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

由于

3 个答案:

答案 0 :(得分:4)

使用字符类,并确保使用字符串标记的开头\A和字符串结尾标记\z来检查整个字符串。

您还应该使用*+来表示您想要匹配的字符数 - *表示“零或更多”,而+表示“一个或多个”更多“。

因此,下面的正则表达式是“在(不区分大小写)字符串的开头和结尾之间,应该只有以下一个或多个字符:a,c,g,t”

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

答案 1 :(得分:4)

您的角色等级[A|C|G|T]包含||不代表字符类中的替换,它只代表自己。因此,字符类将包含|字符,这不是您想要的。

您的模式未锚定。模式/[ACGT]+/将匹配包含任何这些字符中的一个或多个的任何字符串。相反,您需要锚定您的模式,以便只匹配从头到尾包含这些字符的字符串。

$可以匹配换行符。为避免这种情况,请在末尾使用\z进行锚定。 \A锚定在开头(虽然在这种情况下使用它或^没有区别,但使用\A可以提供良好的对称性。

所以,你应该写一下:

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

答案 2 :(得分:4)

使用字符计数tr运算符:

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

tr/characterset//计算字符串中字符集中的字符数;使用/c标记,它会计算字符集中的数量。使用!~代替=~会否定结果,所以如果没有字符不在字符集中则为true,如果字符不在字符集中则为false。