2016-05-03 8 views
0

以下の文字列は.csvファイルからのものです。カンマ小数点を小数点、つまり「92,3245」 - >「92.3245」に置き換える必要があります。それ以外は変わらないはずです。非常に特定のパターンを見つけてregexprepで置換する

str = 'Data,2016-03-11,12:25:55;660,"100","0","92,3245","145","0","0"' 

私はその後、

pat = ',*(?=\d*")'; 
str = regexprep(s,pat,'.'); 

しかし、その後

を試してみました

pat = ',*(?=\d)'; 
str = regexprep(str,pat,'.'); 

しかし、その後

>> str = 
    Data.2016-03-11.12:25:55;660,"100","0","92.3245","145","0","0" 

を試してみました

>> str = 
    Data,2016-03-11,12:25:55;660."100"."0"."92.3245"."145"."0"."0" 

私は',*(?=\d*")'の後に任意の桁数の後に引用符が続くカンマと一致しますが、これはそうではありません。

すべてのご協力をいただきありがとうございます。明確にするために

:望ましい結果は、あなたが正しい軌道に乗っている

str = 'Data,2016-03-11,12:25:55;660,"100","0","92.3245","145","0","0"' 
+0

[regex101](https://regex101.com)のようなサイトで遊んでパターンを洗練させることをお勧めします。 – excaza

答えて

3

です。注意が必要な最も重要なことは、*+の違いです。連続expr+試合expr一つ以上のthe documentationexpr*試合exprゼロまたはそれ以上の連続し回、から。あなたは,が一致する必要がないため、末尾の番号を持っているstrのすべてを一致させたいMATLABの正規表現エンジンを言っている',*(?=\d)'とそう

Data..2.0.1.6-.0.3-.1.1..1.2:.2.5:.5.5;.6.6.0,".1.0.0",".0",".9.2..3.2.4.5",".1.4.5",".0",".0" 

我々は数量詞を交換した場合、我々は以下の取得:

str = 'Data,2016-03-11,12:25:55;660,"100","0","92,3245","145","0","0"'; 

expression = ',+(?=\d)'; 
replacement = '.'; 
newstr = regexprep(str, expression, replacement) 

どちらがエンジンがそうでなければ、のようなもので終わるだろう、これを行う少なくともに十分にスマートではありませんリターン:今

newstr = 

Data.2016-03-11.12:25:55;660,"100","0","92.3245","145","0","0" 

、あなたは正しくパターンが十分に特異的ではなかったことに気づき、あなたが続いていますコンマを見つけたいと言って、それを洗練しましたいくつかの桁数は引用符です。しかし、やはり*で正規表現エンジンにstrのすべてを見つけて置き換え、末尾の1桁(数字の後ろに\dがない)と引用符を付ける必要があります。カンマと一致する必要はないからです。

、我々は再び数量を交換した場合、我々は次を得る:

str = 'Data,2016-03-11,12:25:55;660,"100","0","92,3245","145","0","0"'; 

expression = ',+(?=\d+")'; 
replacement = '.'; 
newstr = regexprep(str, expression, replacement) 

返す:

newstr = 

Data,2016-03-11,12:25:55;660,"100","0","92.3245","145","0","0" 

イェーイを!

この正規表現では、桁区切りと小数点区切り文字が表示される大きな数字は修正されません。

+0

魅力的な作品! @excazaの徹底的な説明をいただき、ありがとうございます。本当にありがとうございます! – JCKaz

関連する問題