元字符
正则表达式:是一套规则 字面量:// new RegEXP("这中间就是规则");
- 一般用来处理字符串的查询或者替换工作
元字符:
- \ 转移符
- \d 匹配数字 【0-9】
- \D非数字
var str="123abdfns";
var reg = /1/;
console.log(reg.test(str));
结果是true; reg.test(str) 在str 里匹配reg规则 如果匹配成功,返回true 否则false
var str="1a23abdfns";
var reg = /12/;
console.log(reg.test(str));
false 正则规则是一套的 不能分开看 12之间有a
var str="a23abdfns";
var reg = /\d/;
console.log(reg.test(str));
</script>
结果是true
- \s 空格 注意不是换行
var str="a 23abdfns";
var reg = /\s/;
console.log(reg.test(str));
true
- \S 非空格
- \w 字符(数字、字母、_)
var str=" ";
var reg = /\w/;
console.log(reg.test(str));
空格不在这个范围内 false
- \W 除了\w以外的所有
- .匹配任意字符 不包括\n \r
- \n 换行 \r
var str=" ";
var reg = /./;
console.log(reg.test(str));
true
- \b 独立部分 单词的边界 左右两边空的部分 单词的起始和结束 连词符 除了\w之外所有的字符都属于连字符 - + * /
- \B 非独立的部分
var str="a";
var reg = /\b/;
console.log(reg.test(str));
true 只要是个单词哪怕是字母 都有边界 两侧就是边界
var str="a";
var reg = /\B/;
console.log(reg.test(str));
false
var str="ab";
var reg = /\B/;
console.log(reg.test(str));
在ab之间
var str="a_b";
var reg = /\b/g;
console.log(str.replace(reg,6));
结果6a_b6 中间_算一个整体单词
var str ="abdjh";
var reg =/\ba/;
console.log(reg.test(str));
true
var str ="abdjh";
var reg =/\bd/;
console.log(reg.test(str));
false
var str ="ab-bdjh";
var reg =/\bb/;
console.log(reg.test(str));
true 因为-是单词边界
量词
写法{} 控制数量 控制的是前一个字符
var str ="1234567";
var reg =/\d{5,9}/;
console.log(reg.test(str));
true {5,9}代表最少出现5次 最大9次。
- {0,} 最少0次 最多无限次 简写:*
- {1,} 1到正无穷 +
- {0,1} 可有可无 简写: ?
var str ="bbbbb";
var reg =/a?/;
console.log(reg.test(str));
true
var str ="妈你";
console.log(str.replace(/你?/g ,""));
妈
标识符
- g global 全局
- i 忽略大小写
- m 换行匹配
var str ="bbbbb";
var reg =/B/i;
console.log(reg.test(str));
标识符写在斜杠后面
str.match(reg)
match() 字符串的方法 str.match(reg) 会返回一个数组 包含匹配的内容 如果匹配失败就返回null
贪婪和非贪婪
- {}量词默认以最高次开始匹配 如果不成功就递减1 知道第一次匹配成功 贪婪模式
- 非贪婪模式 从低次开始匹配 量词后面加? 就是非贪婪模式{}?
var str ="293894235653 a 9012384875";
var reg =/\d{3,}/;
console.log(str.match(reg));
["293894235653", index: 0, input: "293894235653 a 9012384875", groups: undefined] 贪婪模式
var str ="293894235653 a 9012384875";
var reg =/\d{3,}?/;
console.log(str.match(reg));
["293", index: 0, input: "293894235653 a 9012384875", groups: undefined]
var str ="293894235653 a 9012384875";
var reg =/\d*/g;
console.log(str.match(reg));
["293894235653", "", "", "", "9012384875", ""] 全局匹配 空格是0字符 所以返回“” 到9012384875之后 计算机并不知道结束 接着找走到引号为止
var str ="293894235653 a 9012384875";
var reg =/\d+/g;
console.log(str.match(reg));
["293894235653", "9012384875"]
转义字符\n 换行匹配m
var str ="123\n456";
var reg =/^456/m;
console.log(str.match(reg));
["456", index: 4, input: "123↵456", groups: undefined]
- ^开头
var str ="a123b";
var reg =/^123/g;
console.log(str.match(reg));
尖括号在非括号里代表以123开始 返回null
- $ 结尾
var str ="456\n456";
var reg =/^456/gm;
console.log(str.match(reg));
["456", "456"] 可以任意组合gmi 不分顺序 返回的数组有length属性 0是匹配的内容 index是内容在原内容的位置 input是源头内容 length 是返回的个数
子集
被圆括号包起来的部分属于一个整体
var str ="abcccabc";
var reg =/abc+/g;
console.log(str.match(reg));
Array(2)0:"abccc" 1:"abc" length:2
var str ="abcccabc";
var reg =/(abc)+/g;
console.log(str.match(reg));
["abc", "abc"]
var str = "abbb ababab baaa cbbb bsss";
var reg =/\w(\w)\1+/g;
console.log(str.replace(reg,"2333"));
2333 ababab 2333 2333 2333 \1代表取出第一个分组里的值
var str = "2018-06-18";
var reg =/([0-9]+)-([0-9+]+)-([0-9]+)/;
console.log(str.replace(reg,"$1"));
在replace中用$1取分组一
var str = "2018-06-18";
var reg =/([0-9]+)-([0-9+]+)-([0-9]+)/;
console.log(str.replace(reg,"$2/$3/$1"));
06/18/2018
范围词
【0-9】 范围里的字符都是或者关系 满足一个就行
var str ="2198519768";
var reg =/[0-9]/g;
console.log(str.match(reg));
["2", "1", "9", "8", "5", "1", "9", "7", "6", "8"]
var str ="2198519768aakjfhkjadb";
var reg =/[0-9a-z]/g;//中间不需要逗号
console.log(str.match(reg));
["2", "1", "9", "8", "5", "1", "9", "7", "6", "8", "a", "a", "k", "j", "f", "h", "k", "j", "a", "d", "b"]
或 |
var str ="abc";
var reg =/a|b/g;
console.log(str.match(reg));
["a", "b"]
中文的问题
\u4e00-\u9fa5
var str ="里都啊";
var reg =/[\u4e00-\u9fa5]+/g;
console.log(str.match(reg));
["里都啊"]
非 [^]
var str ="abbc";
var reg =/[^a]bc+/g;//代表bc前面不能是a
console.log(str.match(reg));
["bbc"]
var str = "你好么";
var reg =/[^\u4e00-\u9fa5]/;
console.log(reg.test(str));
false 不要中文
var str ="abc";
var reg =/[abc]+/g;
console.log(str.match(reg));
["abc"]
特殊意义的 使用转移\
var str ="()abc";
var reg =/()/g;
console.log(str.match(reg));
["", "", "", "", "", ""] 因为括号具有特殊的意义
var str ="()abc";
var reg =/\(\)/g;
console.log(str.match(reg));
["()"]
var str ="1234567\nabcd";
console.log(str.replace(/\d+7$/m ,"666"));
666 abcd
方法
- str.match() 找到之后返回数组 一般用来匹配字符串出现的次数 找不到返回null
- str.search () 查找第一次出现的位置
var str = "a1b2c3a4b5";
var reg =/a/g;
console.log(str.search(reg));
0 只查找第一次
- str.replace() 查找替换
var str = "a1b2c3a4b5";
var reg =/a/g;
console.log(str.replace(reg,function(bs){
console.log(bs);
return 555;
}));
a 参数就是查找到的对象 5551b2c35554b5
- str.split()拆分成数组
var str = "a,b,c,d";
var reg =/,/g;
console.log(str.split(reg));
["a", "b", "c", "d"]
RegExp
- reg.exec() 找到之后返回数组
var str = "abcd";
var reg =/\w/g;
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
["a", index: 0, input: "abcd", groups: undefined] 2.html:34 ["b", index: 1, input: "abcd", groups: undefined] 2.html:35 ["c", index: 2, input: "abcd", groups: undefined] 2.html:36 ["d", index: 3, input: "abcd", groups: undefined]
- reg.test()
var str = "abcd";
var reg =/a/g;
console.log(reg.test(str));
存在返回true
脏话过滤
<script type="text/javascript">
console.log(strFilter("你妈","嘿嘿嘿"));
function strFilter(str,rstr) {
var person =["你","他"];
var family =["妈","爸","爷","妹"].join("|");
for (var i = 0;i<person.length;i++) {
str = str.replace(new RegExp(person[i]+"["+family+"]+","gm"),rstr);
}
return str;
}
</script>
打印嘿嘿嘿