使用 regexprep 查找和替换非常具体的模式

Finding, and replacing, a very specific pattern with regexprep

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

你走在正确的轨道上。我看到最重要的是你需要注意的是*+之间的区别。从 the documentation 开始,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)

哪个returns:

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)

哪个returns:

newstr =

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

耶!

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