2

ACGT の文字のみを含む文字列を検証する perl 正規表現を探しています。たとえば、「AACGGGTTA」は有効である必要がありますが、「AAYYGGTTA」は無効である必要があります。これは、2 番目の文字列に A、C、G、T 文字のいずれでもない「YY」が含まれているためです。次のコードがありますが、上記の両方の文字列を検証します

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

ありがとう

4

3 に答える 3

5

\A文字クラスを使用し、文字列の開始トークンと文字列の終了トークン を使用して文字列全体を確認してください\z

また、一致させたい文字数を示すために*orを使用する必要があります--は「0 個以上」を意味し、「1 個以上」を意味します。+*+

したがって、以下の正規表現は、「(大文字と小文字を区別しない) 文字列の最初と最後の間に、次の文字のみが 1 つ以上存在する必要があります: a、c、g、t」と言っています。

if($userinput =~ /\A[acgt]+\z/i)
{
    $validEntry = 1;
    print "Valid\n";
}
于 2013-03-20T02:53:48.830 に答える
5

文字カウント tr 演算子の使用:

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

tr/characterset//文字セット内の文字列の文字数を数えます。/cフラグを使用すると、文字セットに含まれていない数がカウントさます。!~代わりに使用すると=~、結果が否定されるため、文字セットにない文字がない場合は true になり、文字セットにない文字がある場合は false になります。

于 2013-03-20T20:54:50.003 に答える
4

あなたの文字クラス[A|C|G|T]には が含まれています||文字クラスの代替を表すのではなく、それ自体のみを表します。したがって、文字クラスには文字が含まれますが|、これは必要なものではありません。

あなたのパターンは固定されていません。パターン/[ACGT]+/は、これらの文字のいずれかを 1 つ以上含む任意の文字列に一致します。代わりに、最初から最後までそれらの文字だけを含む文字列のみが一致するように、パターンを固定する必要があります。

$改行に一致できます。それを避けるために\z、最後に固定するために使用します。最初にアンカーを使用します (ただし、それを使用するか、この場合に使用\Aするかに違いはありませんが、使用することで優れた対称性が得られます。^\A

したがって、チェックは次のように記述する必要があります。

if ($userinput =~ /\A [ACGT]+ \z/ix)
{
    $validEntry = 1;
    print "Valid\n";
}
于 2013-03-20T03:17:34.937 に答える