0

下面的字符串来自 .csv 文件。我需要用小数点替换逗号小数点,即“92,3245”->“92.3245”。其他一切都必须保持不变。

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

我试过了

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

但是之后

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

然后我尝试了

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

但是之后

>> 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"'
4

1 回答 1

3

你在正确的轨道上。我看到你需要注意的最重要的事情是 和 之间的*区别+。从文档中,连续expr*匹配expr 零次或多次,其中连续expr+匹配expr 一次或多次。

所以',*(?=\d)'你告诉 MATLAB 的正则表达式引擎你想要匹配所有str有尾随数字的东西,因为,不需要匹配。引擎至少足够聪明,会这样做,否则你最终会得到类似的东西:

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用一个尾随的单个数字替换所有内容(您在 之后没有量词\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"

耶!

值得注意的是,这个正则表达式不会修复大数字,您会看到千位分隔符和小数分隔符。

于 2016-05-03T13:25:20.233 回答