2011-09-26 9 views

答えて

6

.*?は怠惰であり、それが可能であればゼロの文字と一致しますので。

$key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)$/ 

しかし、それはキャッチオール .*.*?より明示的なものを使用することはほぼ常に良いでしょう:文字列の末尾に正規表現をアンカー。正規表現エンジンに正確に一致させたいものを伝えます。区切り文字 -:は、実際の試合で発生しないと仮定すると、私は

$key =~ m/deco-([^-]*)-([^-]*)-([^:]*):([^:]*):([^:]*)$/ 
  • [^-]は「-以外の任意の文字に一致する」という意味を示しています。
  • [^:]は、「:以外の文字に一致します」を意味します。
+0

ありがとうTimさん、私は最後に '$'を追加しましたが、何らかの理由で私のperlがそれを気に入らず、私に掛かってしまったので、今はうまくいきます:) –

+0

文字列が一致しなかったためにハングアップしている可能性があります。 '。*? 'のすべての順列の数は指数関数的になりました。これは[致命的なバックトラック](http://www.regular-expressions.info/catastrophic.html)と呼ばれ、より具体的なマッチングルールが可能な場合は '。*'を避けるべき理由の1つです。 –

2
split qr/[:-]/, 'deco-1-LB-700F:MAR:40' 

あなたはtghe最後に戻っ

(
    'deco', 
    1, 
    'LB', 
    '700F', 
    'MAR', 
    40, 
) 
+0

これを掲載するためにここに来ました。簡単な方法。実際に 'deco'で始まる文字列がそれ自身で得られたと仮定します。 OPは、より大きい本文でそれを探している可能性があります。 – AmbroseChapel

+0

ありがとう、そう簡単です!そして、私はそのフォーマットのデコで始まる文字列だけを検索しています。私はティムに感謝しなければなりませんが、なぜ私は$ 5が私が期待していたものではないのかという私の質問に答えましたが、私はこれを私のコーディングの答えとして使用します –

関連する問題