javascript正则表达式简述





compile
编译或改变字符串,参数跟new RegExp相同
var patt = /man/g; var str = "man and woman"; str.replace(patt, str); patt = /man|woman/g; patt.compile(patt); str.replace(patt, str);
exec
检索字符串中正则表达式的匹配
该方法在非全局匹配模式下跟stringObject下的match方法作用一致,返回的结果也一致,返回一个数组,数组的第一个元素是与正则表达式相匹配的文本,之后的项是与子表达式相匹配的文本,index属性代表匹配到的子字符串的首字符在父串中的位置,input属性是父串的值,如果未匹配到,则返回null
在全局匹配模式下,需要循环调用exec方法,exec会从RegExpObject对象下的lastIndex属性指定的字符处开始检索字符串,每次匹配后,lastIndex都会改变为当前匹配到的子文本的最后一个字符的下一个位置,直到返回null。所以在全局模式下完成一个字符串的匹配之后,再用该正则表达式匹配别的文本,需要先手动把正则表达式的lastIndex属性重置为0。全局模式下,只有exec才能匹配出所有的信息,包括子表达式所匹配的文本和文本对应的位置。
var patt = /(hello)|(world)/g; var str = "hello world,helo world";
var result; while((result = patt.exec(str)) != null) {//注意此处的写法啊,(result = patt.exec(str) != null),而不是result = patt.exec(str) != null,想一下有何不同,算数表达式的优先级问题 console.log(result); console.log(patt.lastIndex); }
下面封装一个方法,去除字符串中的重复字符(\1表示从左到右的第一个子表达式所匹配到的文本)
String.prototype.filterExp = function() { var _this = this; var patt = /(.).*\1/; var result; while((result = patt.exec(_this)) != null) { _this = _this.substring(0, result.index + 1) + _this.substring(result.index + 1).replace(new RegExp(result[1], "g"), ""); patt.lastIndex = 0; } return _this; } var str = "habacabefgeeii"; var rel = str.filterExp();
console.log(rel);
test
检索子一个字符串是否匹配某个正则表达式,匹配返回true,否则false
var patt = new RegExp("how","gi");
patt.test("HOW are you");
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
}
用正则表达式限制只能输入数字
onkeyup="value = value.replace(/[^\d]/g, '')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g, ''))"
用正则表达式限制只能输入中文
onkeyup="value = value.replace(/[^\u4e00-\u9fa5]/g, '')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4e00-\u9fa5]/g, ''))"
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
贪婪匹配和非贪婪匹配,正则表达式默认为贪婪匹配,尽量往多了匹配
| 贪婪 | 惰性 |
| + | +? |
| ? | ?? |
| * | *? |
| {n,m} | {n,m}? |
| {n,} | {n,}? |
| {n} | {n}? |
效果区别:
var str = "6hello6 6hello6 6hello6"; var patern = /6(.+)6/g; //贪婪模式 var patern2 = /6(.+?)6/g; //非贪婪模式 var rel = str.replace(patern, "XXX");//结果为"6XXX6" var rel2 = str.replace(patern2, "XXX");//结果为"6XXX 6XXX6 6XXX6";

浙公网安备 33010602011771号