正则表达式的创建
字面量创建
// 字面量形式创建
// var reg = /条件/匹配模式
// 匹配模式有 g i m 三种
// g 全局匹配 i 忽视大小写 m 多行匹配
// 条件写在两个斜线之间
var reg1 = /hello/g
构造函数创建
// 构造函数创建
// var reg = new RegExp('正则表达式','匹配模式');
var reg2 = new RegExp('hello','g');
使用方法:
- 使用exec方法检测,检测之后返回一个数组,里面是对应的匹配字段和对应索引,不满足条件就返回null:
[匹配的内容,index: 在str中匹配的起始位置,input: 参数字符串,groups: undefined]
如果是全局模式的正则验证 还可以使用循环进行输出 :(前提是开启全局匹配模式)
// 如果是全局模式的正则验证 还可以使用循环进行输出
while(true)
var result = reg.exec(str);
if(!result){
break;
}
console.log(result[0],result["index"],reg.lastIndex);
}
注意点:
1)如果正则表达式中有修饰符"g",这时,在正则表达式的实例reg中会维护lastIndex属性,记录下一次开始的位置,当第二次执行exec的时候,从lastIndex开始检索。
2)如果正则表达式中没有修饰符"g",不会维护lastIndex属性,每次执行从开始位置检索
-
使用 test方法检测, 满足条件返回true 不满足返回false
tostring / toLocaleString ()
value()
var reg2 = new RegExp('hello','g');
console.log(reg2.toString()); // 把正则表达式的内容转化成**字面量形式字符串**/有本地特色的字符串(**JS中没效果**)
console.log(reg2.valueOf()); // 返回正则表达式本身
正则表达式实例属性
- lastIndex()-- 没有开启全局匹配是该属性值一直为0
设置了全局匹配时,每执行一次exec/test来匹配,lastIndex就会移向匹配到的字符串的下一个位置,当指向的位置后没有可以再次匹配的字符串时,下一次执行exec返回null,test执行返回false,然后lastIndex归零,从字符串的开头重新匹配一轮
可以理解成,每次正则查找的起点就是lastIndex
var str = 'hello html hello css hello js'
// 没有开启全局匹配
// 没有lastIndex这个属性,每次匹配完都从头开始
var reg1 = /hello/
// 开启全局匹配
var reg2 = /hello/g
console.log(reg1.lastIndex); // 0
console.log(reg1.exec(str));
console.log(reg1.lastIndex); // 0
console.log(reg2.lastIndex); // 0
console.log(reg2.exec(str));
console.log(reg2.lastIndex); // 5
console.log(reg2.lastIndex); // 5
console.log(reg2.exec(str));
console.log(reg2.lastIndex); // 16
-
ignoreCase、global、multiline
判断正则表达式中是否有忽略大小写、全局匹配、多行匹配三个模式修饰符
var reg1 = /hello/igm;
console.log(reg1.ignoreCase); //true
console.log(reg1.global); //true
console.log(reg1.multiline); //true
-
source
返回字面量形式的正则表达式(类似于toString)
var reg1 = /hello/igm;
console.log(reg1.source); //hello
正则表达式语法-元字符
-
直接量字符
正则表达式中的所有字母和数字都是按照字面含义进行匹配的,Javascript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜线\作为前缀进行转义。
-
字符集合
一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符‘-’指定一个范围
方括号用于查找某个范围内的字符:
- [abc] 查找方括号之间的任何字符
- [0-9] 查找任何从0至9的数字
-
[^xyz] 一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符。
注意:^写在[]里面是反义字符组
-
边界符
^ 匹配输入开始:匹配句首文本, 表示以谁开始;如果是多行模式则匹配一个断行符后的开始处
$ 匹配输入结尾:匹配句尾文本,表示以谁结束;如果是多行模式则匹配一个断行符前的结尾处
// ^ 匹配输入开始:匹配句首文本
// 表示以谁开始;如果是多行模式则匹配一个断行符后的开始处
var reg = /^abc/; //必须以abc开头才满足
console.log(reg.test('abc')); // true
console.log(reg.test('abcd')); // true
console.log(reg.test('aaabc')); // false
// $ 匹配输入结尾:匹配句尾文本
// 表示以谁结束;如果是多行模式则匹配一个断行符前的结尾处
var reg = /abc$/; //必须以abc结尾才满足
console.log(reg.test('abc')); // true
console.log(reg.test('ddabc')); // true
console.log(reg.test('aaabc')); // false
若 ^ 与 $ 在一起表示精确匹配:
var reg = /^abc$/; //必须是abc字符串才满足
console.log(reg.test('abc')); // true
console.log(reg.test('abcd')); // false
console.log(reg.test('aaabc')); // false
var reg = /^[a-z]$/; // 26个字母任何一个都满足
console.log(reg.test('a')); // true
console.log(reg.test('b')); // true
console.log(reg.test('n')); // true
console.log(reg.test('A')); // false
//字符组合
// 26个英文字母(大写和小写都可以)任何一个字母返回 true
var reg1 = /^[a-zA-Z0-9]$/;
console.log(reg.test('a')); // true
console.log(reg.test('8')); // true
console.log(reg.test('Y')); // true
取反 在中括号里加上^ 表示取反,只要包含中括号里的任何一个字符都返回false
// 取反 在中括号里加上^ 表示取反,只要包含中括号里的任何一个字符都返回false
var reg1 = /^[^a-zA-Z0-9]$/;
console.log(reg.test('a')); // false
console.log(reg.test('8')); // false
console.log(reg.test('Y')); // false
console.log(reg.test('!')); // true
-
字符类
将直接量字符单独放进方括号内就组成了字符类,一个字符类可以匹配它所包含的任意字符。例如:/[abc]/ 就和字母"a"、"b"、"c"中的任意一个都匹配。"^"符号用来定义否定字符类,例如:/[^abc]/ 匹配的是"a"、"b"、"c"之外的所有字符。字符类可以使用连字符来表示字符范围,例如:/[a-z]/,要匹配拉丁字母表中任何字母和数字,[a-zA-Z0-9]
可以结合英文原意记忆:
d ==> digit(数字)
s ==> space(空白)
w ==> word(单词)
-
数量词