什么是正则表达式
菜鸟解释
对字符串操作的一种逻辑公式,用事先定义的特定字符和某些元字符,组成的一个“规则字符串”,这个“规则字符串”表达对字符串的一种过滤逻辑,已达到对目标字符串检索是否存在“规则字符串”,以及对匹配到的“规则字符串”进行提取,替换,删除等操作。
简单来说就是对字符串进行处理的。
优点
1,灵活性,逻辑性和功能性非常强大
2,可以迅速的用极其简单的方式达到字符串复杂的操作
缺点
1,对于刚接触的人来说比较复杂,晦涩难懂
2,具有贪婪性,懒惰性【可避免】
用一个例子简单来介绍其强大之处
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>查找出现最多的字符,不分大小写</title>
</head>
<body>
</body>
<script>
var str = "jhfjshldgfjlshdgfjahwegfhsdfvhifdsvvskdhgvshavfkASYFVVHSDGFVASVVFHSD";
//普通方法
StrArray = str.toLowerCase().split("").sort(); //统一小写化为数组排序
var i, j, count, len = 0;
var obj = {}, //存储字符总类数以及出现次数
array = new Array(); //存储字符,以便作为obj索引
for (i = 0; i < StrArray.length; i++) {
count = 0; //初始化计数为0
var key = StrArray[i]; //提取参照字符
for (j = i; j < StrArray.length; j++) {
//匹配合适,计数加一;否则,进行字符索引和计数存储,跳出此次循环
if (StrArray[j] == key) {
count++;
} else {
i = j - 1;
array[len] = key;
obj[key] = count;
len++;
break;
}
}
}
(function(obj, array) {
var i, j, temp;
//obj中的属性顺序是改变不了,就改变obj字符索引在array中的位置,进行排序
for (i = 0; i < array.length; i++) {
for (j = i + 1; j < array.length; j++) {
if (obj[array[i]] > obj[array[j]]) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
//输出结果
for (i = 0; i < array.length; i++) {
if (obj[array[i]] == obj[array[array.length - 1]])
console.log("出现最多次数的字符是:" + array[i] + "次数为:" + obj[array[i]]);
}
}(obj, array));
//正则方法
Str = str.toLowerCase().split("").sort().join('');//统一小写化为数组排序再转化为字符串
var reg = /(\w)\1+/ig;
var maxStr = '';
var maxLen = 0;
//$0代表(\w),$1代表(\1)
Str.replace(reg, function($0, $1) {
//获取一段相同字符的字符串长度
var regLen = $0.length;
if (regLen > maxLen) {
maxLen = regLen;
maxStr = $1;
} else if (maxLen == regLen) {
maxStr += $1;
}
})
console.log("出现最多的字母是:" + maxStr + "次数为:" + maxLen);
</script>
</html>
//输出为fhsv,10次
从代码上看来,利用正则表达式会更加的简便且易于维护,虽然开始对其可能是一脸蒙蔽,什么火星文字,但是学习它还是有必要性的。
正则表达式创建方式
pattern----正则表达式(模式:由自定义的特定字符和已定义的元字符组成)
flag—标志(标志:)
1,字面量创建方式
var reg = /pattern/flags;
2,实例创建方式
var reg = new RegExp(pattern,flags);
标识符(flag)
1,i
忽略字符串中的所选字符大小
2,g
全局匹配
3,m
文本中的多行匹配
var str = '123sdbs456jscDs789';
reg = /\d+/;//默认标识符为局部匹配
console.log(str.match(reg));//输出“123”
reg = /\d+/g;//输出为“123”,“456”,“789”
reg = /d+/ig;//输出为“d”,“D”
文本就不展示了。。。
元字符
常用特殊字符
\d : 0-9之间的任意一个数字 \d只占一个位置
\w : 数字,字母 ,下划线 0-9 a-z A-Z _
\s : 空格或者空白等
\D : 除了\d,相当于[^\d]
\W : 除了\w,相当于[^\w]
\S : 除了\s,相当于[^\s]
. : 除了\n之外的任意一个字符
\ : 转义字符
| : 或者
() : 分组
\n : 匹配换行符
\b : 匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数
^ : 限定开始位置 => 本身不占位置
$ : 限定结束位置 => 本身不占位置
[a-z] : 任意字母 []中的表示任意一个都可以
[^a-z] : 非字母 []中^代表除了
[abc] : abc三个字母中的任何一个 [^abc]除了这三个字母中的任何一个字符
建议链接
量词符
* : 0到多个
+ : 1到多个
? : 0次或1次 可有可无
{n} : 正好n次;
{n,} : n到多次
{n,m} : n次到m次
正则常用方法
var str = '123hdjs456';
var reg1 = /\d+/g;
var reg2 = new RegExp(/\d+/ , 'g');
test
语法:RegExpObject.test(string)
作用:string存在匹配的正则字段,返回true,否则返回false
console.log(reg1.test(str));//字面创建方式test函数
console.log(reg2.test(str));//实例创建方式test函数
match
语法:strObject.match(searchvalue/regexp)—返回所匹配的值或则null
作用:在strObject中检索指定的searchvalue,或匹配一个或多个regexp
console.log(str.match(reg1));//字面创建方式test函数
console.log(str.match(reg2));//实例创建方式test函数
exec
语法:RegExpObject.exec(string)
作用:返回一个数组,返回匹配的结果
console.log(reg1.lastIndex);//位置为0时开始第一段正则匹配
console.log(reg1.exec(str));//第一段正则匹配,结果为"123"
console.log(reg1.lastIndex);//位置为3时开始第二段正则匹配
console.log(reg1.exec(str));//第二段正则匹配,结果为"456"
console.log(reg1.lastIndex);//位置为10时开始第三段正则匹配
replace
语法:strObject.replace(regexp/substr , replacement)—返回值为匹配完后的新的字符串
substr:【中文意思:字串】
replacement:可以是字符串也可以是返回值为字符串的函数
作用:在字符串中用一些字符替换另一些字符,或则替换一个与正则表达式匹配得字串
var str = '123hhhhhhhhhhhhhhhhhhh456';
console.log(str.replace(reg1 , '0000'));
console.log(str.replace(reg1 , function ( $0 , $1 , $2) {
var Str;
Str = "字符串str被替换数据为:" + $0 + ";起始索引index为:" + $1 + ";字符串str原始总长度为:" + $2.length;
return Str;
}));
结果:
在这里肯定会有人疑惑,$0,$1,$2
是什莫,其实这里是exec函数捕获返回的数组中的值与属性。折磨说肯定听不太懂,我们来看代码。
str.replace(reg1, function($0, $1, $2, $3) {
console.log(reg1.exec(str));
console.log("$0=" + $0);
console.log("$1=" + $1);
console.log("$2=" + $2);
console.log("$3=" + $3);
});
结果:
正则的[]
分组【如果想知道相关()
分组,可自行查找正则分组优先级问题】
我们举个查询年龄问题来看看,平常我们未知查询年龄,我们一般会规定一个范围
例如:查找年龄在16~24岁范围内的,是返回true,不是返回false
var oldObject = {
jack : "17",
tom :"24",
lisa :"34"
}
var arr = new Array ("jack" , "tom" , "lisa");
var reg = /(1[6-9])|(2[0-4])/;
for (var i = 0; i < arr.length; i++) {
var oldstr = oldObject[arr[i]];
console.log(arr[i] + ":" + reg.test(oldstr));
}
有没有注意到我们的范围规定是拆分的,如果我们把reg改成
var reg = /([16-24])/;//报错SyntaxError: invalid range in character class
报错:在特定类中reg是无效范围
所以可得:在[]中不会出现两位及其以上位数的数字
关于regexp的贪婪性【利用量词符解决】和懒惰性【利用全局标志g
解决】,在这就不多加累述了。
菜鸟爬行中…