2016-09-24 54 views
-2

我需要在文本清洗/正常化過程中的一些幫助Perl的正則表達式來進行貨幣換算

我在哪裏,我需要的貨幣格式轉換的地方擊中

輸入:億$輸出:100百萬美元

輸入:EUR20億輸出:20000000歐元

我使用Perl的正則表達式清洗過程中,幫助將不勝感激,如果有人能幫助我提供一個正則表達式輸入轉換爲輸出

這是我到目前爲止的代碼

s/([\$])([0-9\.])([million])/ $2 $3 dollars/g; 

例子數爲4.2 $億

這是我嘗試了將美元符號爲「元」字,並轉移到了最終的短語,但它是沒有提供預期的結果,它提供了我「200萬」作爲輸出

+2

如果你有一個問題,您的代碼,那麼你需要清楚地表明你的計劃,你的輸入和輸出數據以及您需要的輸出。如果你還沒有寫任何東西,那麼你至少應該嘗試一下:Stack Overflow不是免費的編程工作。 – Borodin

+2

我們不是在這裏寫你的代碼,我們不是魔術師來預測你的代碼,你有什麼嘗試,什麼是錯的。請包括您嘗試過的以及不能正常工作的特定問題,幷包含代碼,錯誤和錯誤行。請記住,我們不是在這裏發佈教程,也不是在這裏編寫代碼。編輯你的問題,幷包括我說的和你的問題**可能**會被回答。 –

+0

另外,你確定它是'$'與'eur',但不是'€',歐元與美元,而不是美元? – choroba

回答

0

您的正則表達式確實而不是給你聲稱它的結果。

s/([\$])([0-9.])([million])/ $2 $3 dollars/g; 

隨着/x修改,我們可以添加空白(即使換行和註釋)的模式來提高可讀性的幫助。你的模式可以被重新寫爲

s/([\$])  # match a literal $ and capture that as $1 
    ([0-9.])  # match ONE digit or a dot and capture as $2 
    ([million]) # match ONE character of 'm', 'i', 'l', 'o', 'n' 
       # and capture as $3 
/$2 $3 dollars/gx; 

沒有辦法$100 million匹配這個模式並導致.2 million。可能的輸入是 $3i,$.o$9m。他們會給3 i dollars. o dollars9 m dollars

你所尋找的是這樣一種模式:

s/\$  # a literal '$' 
    ([\d.]+) # one or more digits or dots, like e.g. '99.5', 
      # captured as $1 
    \s+  # one or more whitespace 
    (million) # the literal text 'million', captured as $2 
    /$1 $2 dollars/gx; 

(或者,作爲一個班輪:s/\$([\d.]+)\s+(million)/$1 $2 dollars/g;

注意$2在這種情況下總是million和你也可以將其重寫爲s/\$([\d.]+)\s+million/$1 million dollars/g;(在million附近省略())。

+0

這工作像一個魅力很多謝謝 –

+0

謝謝,但實際上[@ choroba's answer](http://stackoverflow.com/a/39678548/5830574)更一般,並考慮到不同的貨幣和數量(數千/百萬)。我會去那個。 – PerlDuck

1

[...]在一個正則表達式引入了一個字符類,所以[million]相同[nolim],和它匹配這些字符的一個

我會爲散列中的貨幣創建一個轉換表。從哈希鍵,你可以建立符合他們一個正則表達式,並用它在更換:

#!/usr/bin/perl 
use warnings; 
use strict; 
use utf8; 
use feature qw{ say }; 

my %currency = ('$' => 'dollar', # or dollars? 
       eur => 'euros', 
       '€' => 'euros', 
); 

my $regex = join '|', map quotemeta, keys %currency; 

for my $input ('$100 million', 'eur20 million', '€13.2 thousand') { 
    (my $output = $input) 
     =~ s/($regex)([0-9.]+ (?:million|thousand))/$2 $currency{$1}/g; 
    say $output; 
} 
+0

此代碼按預期工作非常感謝您的代碼 –