我正在寻找一个perl正则表达式,它将验证只包含字母ACGT的字符串。例如" AACGGGTTA"应该是有效的" AAYYGGTTA"应该是无效的,因为第二个字符串有" YY"这不是A,C,G,T字母之一。我有以下代码,但它验证了上述字符串
if($userinput =~/[A|C|G|T]/i)
{
$validEntry = 1;
print "Valid\n";
}
由于
答案 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。