0

为什么

var a = "1ab";
a = a.replace(/[^\d][a-z]/g, "");

删除“a”和“b”?我认为它应该只删除“b”,因为“a”前面有一个我被 [^\d] 排除的数字。

谁能帮我?

4

4 回答 4

3

它会删除它们,因为您的字符类[^\d]意味着“任何不是数字的东西”。^意思是“不是”,意思\d是“数字”。所以你的表达的意思是“匹配任何不是数字后跟任何小写字母的东西”,它匹配"ab".

要仅删除前面没有数字的小写字母,使用捕获组可能最简单:

a = a.replace(/([\d][a-z])[a-z]/g, "$1");

这就是说:匹配一个数字后跟一个小写字母(作为一个组)后跟一个小写字母(组外),并将其替换为组的内容。如果要从中删除"c",请在最后一个 之后"1abc"添加一个,例如:。+[a-z]/([\d][a-z])[a-z]+/g

于 2012-07-20T07:58:02.360 回答
2

您的正则表达式说要替换一个不是数字的字符,然后是一个没有任何内容的 az 字符,并替换它找到的所有匹配项。

在您的字符串 1ab 中,它将首先匹配aas NOT 数字,然后匹配bas az,因此您的字符串中将留下“1”。

如果你想找到一个数字后跟一个字母并提取它,我建议这样做:

var match = a.match(/\d[a-z]/);
if (match) {
    var result = match[0];
}
于 2012-07-20T07:59:28.530 回答
1

你的正则表达式正在做它所说的:

var a = "1ab";
a = a.replace(/[^\d][a-z]/g, "");
...............a....b

它正在用“”替换ab

如果您只想替换前面没有数字的字母,您可以执行以下操作:

a.replace(/([^\d])[a-z]/g, "$1");
............a.....b   ......a

它用第一个匹配“a”替换ab

于 2012-07-20T08:01:45.667 回答
0

你想要的可能是一个消极的lookbehind,换句话说,正则表达式应该是/(?!<\d)[a-z]/g。这会发现任何前面没有数字的(小写)字符(我猜这是你想要的,因为你只希望 b 被删除)。

于 2012-07-20T08:01:29.073 回答