2012-07-20 88 views
0

为什么用正则表达式插入符号

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

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

谁能帮帮我?

+0

'a = a.match(/ [^ \ d] [az]/g,“”);'试试这个和你会看到你的代码匹配 – Bob 2012-07-20 08:06:24

+3

正如你可以从答案中看到的,有很多人可以帮助你做到这一点,但是你可能想要更准确地知道你到底想要什么。有很多方法去除b,如果你指定了你的规则是什么,哪些东西要保留,哪些要丢弃,那将是很好的方法。 – Thor84no 2012-07-20 08:06:48

+0

感谢您的建议。我明白你的意思!在这种特殊情况下,我实际上不明白为什么RegExp以这种方式行事。当然,这背后有一项编程任务,但与这个特殊问题无关。我是RegExp的新手,我不知道捕获组甚至存在。现在我做:-) – heinob 2012-07-20 12:49:05

回答

3

它将它们删除,因为你的角色类别[^\d]表示“任何不是数字的东西”。 ^表示“不”,而\d表示“数字”。所以你的表达的意思是“匹配任何不是数字后跟任何小写字母”,匹配"ab"

要删除没有一个数字在他们面前的只有小写字母,它可能是最容易捕获组做到这一点:

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

,上面写着:匹配一个数字,然后按小写字母(作为一个组),然后是一个小写字母(在组外),并将其替换为组的内容。如果您想从"1abc"删除"c",请在最后一个[a-z]后添加+,例如:/([\d][a-z])[a-z]+/g

+0

啊。得到它了!那么表达式是什么:所有字符都不是前面的数字? – heinob 2012-07-20 08:02:24

+0

@heinob:我添加了一个表达式来帮助'1ab',但它不像“没有数字前面的所有字符”一般。 – 2012-07-20 08:04:44

2

你的正则表达式用于替换一个不是数字的字符,后面跟着一个没有空格的字符,并替换它找到的所有匹配。

在您的字符串1ab中,它将首先匹配a而不是数字,然后b作为a-z,因此您的字符串中将保留“1”。

如果你想找到一个字母出了一些后续并提取了这一点,我建议这样的:

var match = a.match(/\d[a-z]/); 
if (match) { 
    var result = match[0]; 
} 
0

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

+1

JavaScript没有它们。 (不是我的DV,顺便说一句) – 2012-07-20 08:05:11

+0

没错,我没有发现它是JS。那么明显的解决方案就是使用一个人们已经涉及的捕获组。 – Thor84no 2012-07-20 08:09:26

1

你的正则表达式是做什么它说:

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

它与“”替换AB

如果你想更换不仅没有一个数字preceeded字母,你可以这样做:

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

它用第一个匹配“a”取代ab