0

如果在字符串中存在没有前导零的有效数字,例如“.5”、“+.5”或“-.5”,如何使用正则表达式匹配这样的模式,然后添加前导零?

说,

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

我希望它是

0.5x-0.3/+0.74x1.2

并使用

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

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

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

4

2 回答 2

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)

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

于 2013-03-01T09:48:29.453 回答
1

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

(?<!\d)前面没有数字(与\Dwich不同,前面有一个不是数字的字符,如果字符串以 开头,则不匹配.5),非消耗(负后视)。

\.是点(duh),消耗。

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

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


编辑:由于 VBScript 不支持后视,您可以使用稍微复杂的替换(\D|^)\.(?=\d)with $10.(假设 VBScript 风格不尝试获得第 10 组,而 JavaScript 似乎没有这样做)。该(\D|^)\.部分将匹配以字符串开头或任何非数字字符开头的点。前一个字符已被消耗,因此您必须将其放回原处,因此$1.

于 2013-03-01T10:01:06.583 回答