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";
posted @ 2016-12-20 14:04  策马咻咻咻  阅读(160)  评论(0)    收藏  举报