使用 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"
耶!
值得注意的是,此正则表达式不会修复大数字,在那里您会看到千位分隔符和小数点分隔符。
下面的字符串来自 .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"
耶!
值得注意的是,此正则表达式不会修复大数字,在那里您会看到千位分隔符和小数点分隔符。