正则表达式问题:为什么不匹配?

问题描述:

我有以下的正则表达式:(?<=\.\d+?)0+(?=\D|$)我跑这对包含以下字符串:SVC~NU^0270~313.3~329.18~~10~~6.00:正则表达式问题:为什么不匹配?

当它运行时,它匹配的6.00(正确),这我的逻辑,然后修剪一个零变成6.0 。正则表达式然后再次运行(或应该),但没有拿起6.0。

我决不是一个正则表达式的专家,但我对我的表达的理解是,它正在寻找一个或多个可选(所以,真正为零或更多)数字的小数点之前的一个或多个零是然后是任何非数字字符或换行符。假设解释是正确的,我不明白为什么它不会匹配第二遍。对于这个问题,我不知道为什么我的Regex.Replace不匹配第一遍的完整6.00并删除两个尾随零...

有什么建议吗?

+0

这正则表达式是寻找最后的零,如果它发现它,它就会删除它(因此比赛) - 如果没有第二个“0”无法找到匹配,因此失败... [仔细看看你]找到补救办法 - 你需要什么来恢复? – Glycerine 2010-05-17 18:31:46

+0

第二个想法,@Glycerine是对的:目前还不清楚你期望的最终结果。我的答案会“修复”表达式,但结果会很奇怪(至少对我来说),因为它会去掉所有尾随的零,只留下'6.'。 – 2010-05-17 18:40:39

+0

最终,如果在它后面没有数字,我确实希望小数点被删除,但是我相对有信心能够做到这一点 - 我无法弄清楚为什么单个0不匹配。谢谢。 – AllenG 2010-05-17 18:45:19

+?表示“匹配一个或多个,非贪婪”。你大概认为它意味着与*相同,即匹配零次或多次。所以前面的表达式\d必须匹配至少一次,以便您的整个表达式匹配,而输入6.0不再是这种情况。

更改+?*并且该表达式应该起作用。

+0

我刚刚试过,那会去掉任何零的句号......因此'SVC〜NU^0270〜313.3〜329.18〜10〜6.00000000000:'会变成'SVC〜NU^0270〜313.3〜329.18 ~~ 10 ~~ 6.:' – Glycerine 2010-05-17 18:35:42

+0

@Glycerine:是的,这会改变正则表达式的含义。这不是OP想要的吗?毕竟,他明确地*想*找到'6.0'并去掉尾随的零。 – 2010-05-17 18:39:31

+0

这意味着只有在小数点后至少有两位数字,并且最后一位或一位数字为零时,您的正则表达式才会匹配。它不会在小数点后直接匹配零。 我想你只需要用'\ d *'替换'\ d +?'# – Bounderby 2010-05-17 18:40:01

试试这个:

(?<=\.\d+?)0*?(?=\D|$) 
+0

注意,这可能会导致大小为零的匹配(如果.NET中有这样的事情......)。 – 2010-05-17 18:46:08

+0

此更改仅允许它在序列*不以*结尾时匹配空字符串 - 而且是@Konrad,这是完全合法的。但在这种情况下,这是毫无意义的,因为意图是去除尾随的零。 – 2010-05-18 01:38:51