2012-01-16 15 views
0

私はPerlの正規表現に遭遇しました。私はかなり新しいPerlです - しかし、私はそれが私の問題だとは思わない。私は基本的に単一のタグのためのXML形式のファイルを解析していPerl Regex( d * 。 d {2})

if ($line =~ m/<amount>(\d*\.\d{2})<\//) { $amount = $1; } 

:ここ

はコードです。ここで私が解析しようとしている特定の値があります。

<amount>23.00000</amount> 

誰かが私の正規表現が機能しない理由を説明できますか?

EDIT:通貨価値として金額をインポートしようとしています。末尾3小数は無用です。

+0

あなたのテキストに5が入っている小数点以下2桁のみ一致しています – Neverever

+0

あなたの正規表現には本当にバックティック文字がありますか? –

+0

申し訳ありませんが、実際の正規表現にバックティックはありませんでした。何らかの理由でサイトが私の "コード"内でを無視していたので、それらを入れました。 – Rico

答えて

5

\d*\.\d{2}正規表現のフラグメントのみを正確に小数点以下に番号を認識。サンプルに小数点以下5桁があるため、このフラグメントと一致しません。

小数点以下1桁が必要な場合は\d*\.\d+、小数点以下2桁と5桁の間にある場合は\d*\.\d{2,5}を使用します。

正規表現でバックティック文字を使用しないでください。正規表現で意味を持たないため、通常の文字として解釈されます。

だからあなたが使用したい:正規表現パターンでは

if ($line =~ m/<amount>(\d*\.\d{2,5})<\/amount>/) { $amount = $1; } 
0

、シーケンス「{2}」直前のパターンの一致正確 2つのインスタンスを意味します。

だから、\ d {2}は2桁にしか一致しませんが、入力テキストはその時点で5桁です。

末尾の数字を必要としない場合は、キャプチャ括弧の外側にある\ d *を使って破棄することができます。

パターンにスラッシュが含まれている場合は、別の区切り文字を使用してスラッシュをエスケープしないようにしてください(例:あなたはXMLを解析したい場合は

if ($line =~ m{<amount>(\d*\.\d{2})\d*</}) { $amount = $1; } 

また、あなたは、このようなXML::LibXMLとしてXMLライブラリを使用して検討する必要があります。

関連する問題