下面的字符串来自.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"'
答案 0 :(得分:3)
你走在正确的轨道上。我认为您需要注意的最重要的事情是*
和+
之间的区别。来自the documentation,expr*
连续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"
耶!
值得注意的是,这个正则表达式不会修复大数字,你会看到千位分隔符和小数点分隔符。