为什么JavaScript中正则表达式的test方法会出错?

一段这样的JavaScript代码,猜猜结果如何?

var i = 0, m = 20, a = [], r = /^\d+$/g;
for(i = 0; i < m; i++){
    a.push('' + i);
}

m = a.length;
for(i = 0; i < m; i++){
    if(r.test(a[i])){
        document.write(a[i] + 'true<br />');
    }
    else{
        document.write(a[i] + 'false<br />');
    }
}

也许你期待的结果应该全是true,可是实际结果呢?true和false交替出现,0是true,1是false,2是true,3是false……是不是很怀疑?其实仔细看一下,那个正则表达式多了个全局选项“g”,去掉就好了。

可是为什么有“g”就会出错呢?

原因其实很简单,当一个模式具有全局选项时,和exec一样,每次test都会保留上次匹配的位置——即lastIndex。很显然,当第一次匹配之后,第二次匹配时的lastIndex已经到了字符串末尾,尽管这个时候字符串已经是一个新的字符串了,但是这个lastIndex的位置并没有重新初始化,所以会从末尾开始匹配——当然会匹配失败了。…

C#:在正则表达式替换时进行处理

有些时候我偶们希望在正则表达式的替换中对替换的字符换进行简单的处理,比如把所有的A依次替换为B1、B2、B3……这就需在替换时对字符串进行处理,其实这个很简单,用C#中的MatchEvaluator委托就可以了。简单的示例如下:

private static int i = 0;

public static string ParseToHTML(string ubbString)
{
Regex rgx;
string htmlString = "";

MatchEvaluator me = new MatchEvaluator(AddOne);
rgx = new Regex(@"\[code\](.*?)\[\/code\]");
htmlString = rgx.Replace(htmlString, me);

return htmlString;
}

public static string AddOne(Match m)
{
string code = m.Value.Substring(6,