如果在字符串中有没有前导零的有效数字,如“.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引擎
答案 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
。