var reBadWords = /badword | anotherbadword/gi; var sUserInput = "This is a String using badword1 and badword2."; var sFinalText = sUserInput.replace(reBadWords, function(sMatch){ return sMatch.replace(/./g, "*"); //用星号替换敏感词中的每一个字母 });
复杂模式之非捕获性分组:相比捕获性分组,不会创建反向引用,在较长的正则表达式中,存储反向引用会降低匹配速度,通过使用非捕获性分组,仍然可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销
var sToMatch = "#123456789"; var reNumbers = /#(?:\d+)/; //只需要在左括号的后面加上一个问号和一个紧跟的冒号就可创建一个非捕获性分组 reNumbers.test(sToMatch); alert(RegExp.$1); //"",输出空字符串是因为该分组是非捕获性的 alert(sToMatch.replace(reNumbers, "abcd$1")); //输出结果是"abcd$1"而不是"abcd123456789",不能使用任何反向引用
又如:
String.prototype.stripHTML = function(){ var reTag = /<(?:.|\s)*?>/g; //匹配所有的HTML标签,防止插入恶意HTML代码 return this.replace(reTag, ""); }
复杂模式之前瞻:告诉正则表达式运算器向前看一些字符而不移动其位置,存在正向前瞻(检查接下来出现的是不是某个特定字符集)和负向前瞻(检查接下来的不应该出现的特定字符集)
正向前瞻(?=n) 匹配任何其后紧接指定字符串 n 的但不包括 n的字符串,注意这里的括号不是分组
负向前瞻(?!n) 匹配任何其后没有紧接指定字符串 n 的字符串,如:
var sToMatch1 = "bedroom"; var sToMatch2 = "bedding"; var reBed1 = /(bed(?=room))/; var reBed2 = /(bed(?!room))/; alert(reBed1.test(sToMatch1)); //true alert(RegExt.$1); //输出"bed"而不是"bedroom" alert(reBed1.test(sToMatch2)); //false alert(reBed2.test(sToMatch1)); //false alert(reBed2.test(sToMatch2)); //true alert(RegExt.$1); //输出的也是"bed"
复杂模式之边界:用于正则表达式中表示模式的位置
n$ 匹配任何结尾为 n 的字符串,如:/(\w+)\.$/匹配行尾单词"one.","two."等
^n 匹配任何开头为 n 的字符串,如:/^(.+?)\b/匹配起始位置后的一个或多个单词字符
\b 查找位于单词的开头或结尾的匹配,如:/\b(\S+?)\b/g 或 /(\w+)/g匹配从字符串中抽取单词
\B 查找不处在单词的开头或结尾的匹配
复杂模式之多行模式:
var sToMatch = "First second\nthird fourth\nfifth sixth"; var reLastWordOnLine = /(\w+)$/gm; alert(sToMatch.match(reLastWordOnLine)); //输出["second", "fourth", "sixth"]而不只是"sixth"
RegExp对象的属性和方法:
global //RegExp 对象是否具有标志 g
ignoreCase //RegExp 对象是否具有标志 i
multiline //RegExp 对象是否具有标志 m
source //正则表达式的源文本
lastIndex //一个整数,标示下一次匹配钭会从哪个字符位置开始(只有当使用exec()和test()函数才会填入,否则为0)
真正使用到的是lastIndex,如:
var sToMatch = "bbq is short for barbecue"; var reB = /b/g; reB.exec(sToMatch); alert(reB.lastIndex); //1,匹配位置是0,lastIndex为1 reB.exec(sToMatch); alert(reB.lastIndex); //2 reB.exec(sToMatch); alert(reB.lastIndex); //18 reB.lastIndex = 0; //重头开始匹配 reB.exec(sToMatch); alert(reB.lastIndex); //1而不是21
静态属性
input,短名为$_,最后用于匹配的字符串(传递给exec()或test()的字符串)
leftContext,短名为$^,在上次匹配的前面的子串
rightContext,短名为$^,在上次匹配之后的子串
lastMatch,短名为$&,最后匹配的字符
lastParen,短名为$+,最后匹配的分组
multiline,短名为$*,用于指定是否所有的表达式都使用多行模式的布尔值,不同于其它属性,不依赖最后一次执行的匹配,它可以设置所有的正则表达式的m选项,RegExp.multiline = "true";,注意IE和Opera不运行它