0

私はそのようなエントリを持っています:

    XYZABC------------HGTEZCW
    ZERTAE------------RCBCVQE

HGTEZCW と RCBCVQE だけを取得したいと思います。一般的な正規表現を使用したいと思います。

$temp=~ s/^\s+//g;     (1)
$temp=~ s/^\w+[-]+//g; (2)

(1) + (2) を使用すると、機能します。それはうまくいきます:HGTEZCW、そしてRCBCVQE...

次のような1行でそれを行うことが可能かどうか知りたいです:

$temp=~ s/^\s+\w+[-]+//g; (3)

(3) を使用すると、次の結果が得られます。XYZABC------------HGTEZCW

1 + 2 を 1 行に連結できない理由がわかりません。

申し訳ありませんが、私のエントリは :

    XYZABC------------HGTEZCW
    ZERTAE------------RCBCVQE

また、正規表現 1 はスペースを削除しますが、正規表現 2 を使用すると XYZABC------------ を削除します。しかし、組み合わせ (3) は機能しません。私はこれを持っていますXYZABC------------HGTEZCW

@Timでは、各文字列の先頭には常に空白がありますか? はい

4

3 に答える 3

1

正規表現 (1) は、文字列の先頭から空白を削除します。したがって、サンプル文字列では何もしません。

Reges (2) は、文字列の先頭からすべての英数字とそれに続くダッシュを削除し、最後のダッシュに続くものを返します。

両方を組み合わせると、一致する可能性のある空白がないため\s+、正規表現は失敗します。したがって、正規表現全体が失敗します。

これを修正するには、空白をオプションにします。-また、括弧で囲む必要はありません。

$temp=~ s/^\s*\w+-+//g;
于 2012-05-09T09:24:07.573 に答える
0

各エントリの最後の7文字だけが必要な場合は、次のようにすることができます。

$temp =~ /.{7}$/;
于 2012-05-09T12:12:37.460 に答える
0

これでうまくいくはずです。

$Str = '
    XYZABC------------HGTEZCW
    ZERTAE------------RCBCVQE
';

@Matches = ($Str =~ m#^.+-(\w+)$#mg);

print join "\n",@Matches ;
于 2012-05-09T10:19:22.393 に答える