如何在适用的地方添加前导零?

时间:2013-03-01 09:39:59

标签: regex vbscript

如果在字符串中有没有前导零的有效数字,如“.5”,“+ 5”或“-.5”,如何使用RegExp匹配这样的模式然后添加一个领先零?

说,

s=".5x-.3/+.74x1.2"

我希望它是

0.5x-0.3/+0.74x1.2

并使用

(?!\d)([+-]?)(?!\d)(\.\d+)

作为模式,$10$2作为替换,但为什么不提供正确的东西?

PS:我在Excel中使用VBScript RegExp引擎

2 个答案:

答案 0 :(得分:1)

\B\.

只有在点前面没有数字(或字母)时才会匹配一个点,这应符合您的要求。将其替换为0.

为什么你的正则表达式不起作用?好吧,它说

(?!\d)  # Make sure the next letter isn't a digit
([+-]?) # Try to match a sign (which never is a digit, so why the lookahead?)
(?!\d)  # Make sure the next letter isn't a digit (again)
(\.\d+) # Match a dot and digits (the dot also isn't a digit, so again
        # the lookahead is not necessary)

所以,你可以完全放弃第一个前瞻,第二个前瞻必须是 lookbehind 来做你想做的事情(即断言字符之前点不是数字),但ECMAScript不知道lookbehinds,所以我们必须使用字边界锚点。

答案 1 :(得分:1)

(?<!\d)\.(?=\d)替换为0.,假设您的正则表达式支持负面后卫。

(?<!\d) 前面没有数字(与\D不同,因为前面有一个不是数字的字符并且不会如果字符串以.5开头,则不匹配,非消费(负面观察)。

\.是点(duh),消费。

(?=\d)表示点必须后跟数字,非消费(正面预测)。

唯一消耗的字符是点,因此您只需将其替换为0.


修改:由于VBScript不支持后台广告,因此您可以使用(\D|^)\.(?=\d)稍微复杂的替换$10.(假设VBScript风格不具备尝试获得第10组,JavaScript似乎没有做到)。 (\D|^)\.部分将匹配以字符串的开头或任何非数字字符开头的点。之前的角色已被消耗,因此您必须将其放回,因此$1