使用regexprep

时间:2016-05-03 12:22:41

标签: matlab regexp-replace

下面的字符串来自.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"'

1 个答案:

答案 0 :(得分:3)

你走在正确的轨道上。我认为您需要注意的最重要的事情是*+之间的区别。来自the documentationexpr*连续expr 零或更多次匹配,其中expr+匹配expr 一个或多个< / em>连续几次。

因此,对于',*(?=\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"

现在,您正确地注意到您的模式不够具体,并对其进行了改进,以表示您要查找后跟一些数字的逗号 a引号。但是再一次,使用*,您正在告诉正则表达式引擎在str中找到并替换一个尾随的单个数字(\d之后没有量词)并引用,因为它没有&# 39; t必须匹配逗号。

如果我们再次交换量词,我们会得到以下结果:

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"

耶!

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