如果在字符串中存在没有前导零的有效数字,例如“.5”、“+.5”或“-.5”,如何使用正则表达式匹配这样的模式,然后添加前导零?
说,
s=".5x-.3/+.74x1.2"
我希望它是
0.5x-0.3/+0.74x1.2
并使用
(?!\d)([+-]?)(?!\d)(\.\d+)
作为模式和$10$2
替换,但为什么它不能提供正确的东西?
PS:我在 Excel 中使用 VBScript RegExp 引擎
\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)
所以,你可以完全放弃第一个前瞻,第二个前瞻必须是一个后视才能做你想做的事情(即断言点之前 的字符不是数字),但 ECMAScript 不知道lookbehinds,所以我们必须使用单词边界锚点。
替换(?<!\d)\.(?=\d)
为0.
,假设您的正则表达式风格支持负面的后视。
(?<!\d)
前面没有数字(与\D
wich不同,前面有一个不是数字的字符,如果字符串以 开头,则不匹配.5
),非消耗(负后视)。
\.
是点(duh),消耗。
(?=\d)
表示点后面必须跟一个数字,非消耗(正向预测)。
唯一消耗的字符是点,因此您只需将其替换为0.
.
编辑:由于 VBScript 不支持后视,您可以使用稍微复杂的替换(\D|^)\.(?=\d)
with $10.
(假设 VBScript 风格不尝试获得第 10 组,而 JavaScript 似乎没有这样做)。该(\D|^)\.
部分将匹配以字符串开头或任何非数字字符开头的点。前一个字符已被消耗,因此您必须将其放回原处,因此$1
.