2017-10-25 4 views
-2

以下の例では、str1がstr2と等しいすべてのケース、つまりstr1 eq str2を無視しようとしています。私が直面している問題は以下の通りです。Perlは文字列/浮動小数点数から切り捨てゼロを削除します

CASE1: STR1 = {V1 0.85} 'STR2 = {V1 0.850000}'

ケース2: STR1 = {V1 0.65} {オフV2} {V_3 1.1} 'STR2 = '{V1 0.650000} {オフV2} {V_3 1.100000}'

CASE3: STR1 = {V2 0.0} {V3 2.0} {V4 ON} 'STR2 = {V2 0.0000000} {V3 2.000000} { V4 ON} '

上記の各例は、末尾の0を削除する場合はstr1 = str2の条件を満たす必要があります文字列

$str2 =~ s/\.?0*}/\}/; 

しかし、それはいくつかのケースでのみ動作します:

は現在、これは私が使用しています正規表現です。その上ケース2 例1におけるゼロ{}はなく前に、すなわち

設定2除去: 0009である '{v_0p65 0.65} {vout_offオフ} {v_1p1 1.1}'

用いた正規表現である「{v_0p65 0.65} {vout_offオフ} {1.100000 v_1p1}」

コードは以下のようなものである(一つの小さなスニペットを貼り付けることは複雑すぎる): STR1及びSTR2が受信される2つのハッシュの正確な出力であります反復的に コードは単純に

です英語で
if ($str1 eq $str2) { 
#Don't do anything 
else { 
print ("str1 and str2 are not equal\n"); 
} 
+1

使用している実際のコードを含めることはできますか? –

+0

ちょうど追加..いくつかの入力ファイルを必要とする非常に複雑なコード。しかし、この部分ではまさに上のようなものです。だから私が必要とするのは、str2をstr1に変換するための正規表現です。 – Rancho

+1

あなたの_actual_コードを投稿しないと、_actual_解決法を与えることはできません。現在、 '$ str1 =' $ str2'と等しい場合、 'if'文のデモコードは純粋に一致し、それ以外の場合は何も行いません。 ($ str1 eq $ str2){print ...; ' –

答えて

2
s/ \K0*([0-9]+\.[0-9]+?)0*(?=})/$1/g; 

、直後(零を含まない空間であり、A}、(ちょうど小数点の前にゼロを含まない)小数点の前に先行ゼロを削除し、最後にゼロを後続の間小数点)。

/gは、同じ文字列内でできるだけ多く動作します。あなたの欠点は他の問題もありましたが、それはあなたが欠けていた重要な部分のようです。

+0

ありがとう、それは私が探していたものでした。私はあなたのバージョンで\ Kは何をしていますか?(0-9)+ [0-9] * [1-9] *?)0 */$ 1/g。 – Rancho

+0

'\ K'は'(?<=) 'と同等に効率的です。前にスペースがあることを確認します。先頭の0を削除する必要がない場合、 '\ K0 *'は省略することができます。 – ysth

+0

'[0-9] *?'は '[0-9] * [1-9] *'(inこの特定の場合)。 '? 'は、代わりに0 *の最後に0を入れる方が好きです。 – ysth

関連する問題