形容词
var str = "hunasheng";
var reg = /n/;
console.log(str.match(reg));
结果是在索引2的位置上匹配到了n
那么我向让他在最后的位置匹配到了n,那个怎么办??
先要匹配到最后的n,那么你要定义一个规则,并且这个规则能在最后匹配到n,那么要形容修饰一下n
var str = "hunashengn";
var reg = /n$/;
console.log(str.match(reg));
匹配出来了一个n,这个n所在的位置是索引9,在索引9的位置上匹配到了n
那么这么在开头匹配到一个n,那个怎么办
var str = "nashengn";
var reg = /^n/;
console.log(str.match(reg));
匹配出来了一个n,这个n所在的位置是索引0,在索引0的位置上匹配到了n
注意:形容词的^
符号和表单式中的^
符号是不一样的
- 在表达是中
^
符号是除了后面的字符集合中的其他字符,是除了的意思 - 形容词的
^
符号表示是形容是修饰的作用
其实这个形容词的作用,可能是判断是不是以某一个字符开头的
var str = "huasheng";
var reg = /^h/;
if (reg.test(str)) {
console.log('true');
}else {
console.log('false')
};
如果字符串中第一个字符是h那就走If
,不是则是else
我要匹配字符e
,这个字符e
是字符n
后面的字符e
,那个怎么办???
var str = "huasheng";
var reg = /e(?=n)/;//(?=n)表示后面字符紧跟着的n,这是一个形容词,我要形容e
//那么就是e(?=n)
console.log(str.match(reg));
表示后面紧跟着字符n
的e
。
那么,后面没有紧跟着字符a
的字符h
呢那该怎么办??
var str = "uahehnag";
var reg = /h(?!a)/;
console.log(str.match(reg));
(?<=n)x
匹配到前面紧跟着字符n的x
var str = "uanxhnag";
var reg = /(?<=n)x/;//也可以写多个
console.log(str.match(reg));
(?<!n)x
匹配到前面没有紧跟着字符n的x
var str = "uxnanxhnag";
var reg = /(?<!n)x/;
console.log(str.match(reg));
总结
形容词:修饰字符n (也叫断言)
n$
匹配到在结尾位置的字符n
^n
匹配到在开头位置的字符n
x(?=n)
匹配到后面紧跟着字符n
的x
x(?!n)
匹配到后面没有紧跟着字符n
的x
(?<=n)x
匹配到前面紧跟着字符n
的x
(?<!n)x
匹配到前面没有紧跟着字符n
的x
那像语文哪种叠词的形式该怎么匹配
var str = "aaddcc";
var tag = /[a-z]{2}/;
console.log(str.match(tag));
如果用这种写法,那么aa会被取出来,那么把字符串换成abbbcc
呢,那会把ab
提取出来而不是aa
那么我们该怎么办
那么我该怎么把叠词匹配出来呢??
var str = "adddcc";
var tag = /(\w)\1/;
console.log(str.match(tag));
\1
表示你匹配到的一个数据的复制品,\w
你匹配到了d
,那么\1
是你匹配到d
的复制品,说白了\1
是一个d
,所以当前你需要匹配两个字符是dd
,那会符号条件的dd
就会匹配出来。
可以理解为,你匹配到了什么东西,那么\1
就是你匹配到的那个东西的复制品
那么全局匹配呢
var str = "daddacc";
var tag = /(\w)\1/g;
console.log(str.match(tag));
第一次(\w)
条件匹配了d
那么他会继续往下走,走到\1
那么就是\w
的复制品就是d
,那么就是dd
了完成一次匹配,就走到了g
表示全局匹配,看看全局中有没有符合的(w)\1
的条件如果有就拿着(w)\1
走全局匹配,如果没有就不匹配 。
那么怎么匹配"aabbcc"
的字符串方式该怎么办??
var str = "daabbccfscs";
var tag = /(\w)\1(\w)\2(\w)\3/;
console.log(str.match(tag));
\w
是第一个字符a
\1
是\w
的复制品也是字符a
,\w
是第二个字符b
,那么\2
表示第二个字符的复制品是字符b
也是第二个复制品
\1 \2 \3
反向引用 表示匹配出的值的复制品(必须是\1 \2 \3
的形式的)
补充字符串方法str.replace()
替换字符串方法 (用后面的字符串,替换前面的字符串)
var str = "花生花生";
console.log(str.replace("花生","huasheng"));
现在字符串中的replace
他没有换完,他只换了第一个花生没有换了第二个花生,其实replace
的 第一个参数可以传正则表达式如:
var str = "花生花生";
console.log(str.replace(/花生/,"huasheng"));
其实这个字符串他没有替换完,那该怎么办??
var str = "花生花生";
console.log(str.replace(/花生/g,"huasheng"));
第一次正则匹配到了花生,但是没有写全局匹配他没有往下匹配花生,这时我们需要写一个全局匹配即可,一旦写成全局匹配就替换所有。
练习题目
var str = 'get-element-by-id'; // getElementById
var reg = /-[a-z]/g;
var newStr = str.replace(reg,function(){
return arguments[0][1].toUpperCase()
});
console.log(newStr);
那么如何把aabbcc
这种形式的变成 ccbbaa
这种形式的
var str = "aabbcc";
var reg = /(\w)\1(\w)\2(\w)\3/;
console.log(str.match(reg)[0]);
这是形式虽然是可以匹配到叠词的形式,但是不能匹配到颠倒过来的叠词形式
那该怎么办???
不能匹配那咱们就用replace
方法替换
var str = "aabbcc";
var reg = /(\w)\1(\w)\2(\w)\3/;
str.replace(reg,function(){
console.log(arguments);
});
arguments
他也是个数组,索引0的地方是你要匹配的数据,那为什么索引0的后面有"a" ,"b" , "c"
呢??
因为,\w
可以匹配出来a
的,第二个\w
是可以匹配出来b
的,第三个\w
是可以匹配出来c
的,这个"a" ,"b" , "c"
是因为\w
匹配出来a,b,c
那么就把匹配出来的字符放置在索引0的后面
因为你给\w
写的是(\w)
这个在正则中叫做 子表达式 ,你给\w
加上括号那么\w
就是子表达式。
replace的第二个参数中回调函数中的argentina展示索引
0: "aabb"
符合正则规则的字符
1: "a"
第一个子表达式 只要加上括号就是子表达式(复合正则规则的后面是子表达式)
2: "b"
第二个子表达式
3: 0
在什么位置匹配到了符合正则规则的字符
4: "aabbcc"
原始字符
那么可以这样整
var str = "aabbcc";
var reg = /(\w)\1(\w)\2(\w)\3/;
str.replace(reg,function($,$1,$2,$3){
return $3+$3+$2+$2+$1+$1
});
上面的是一种方式,方法一(必须用$
)
方法二(必须用$
)
当前是有3个字表达式,第一个是a,第二个是b,第三个是c
var str = "aabbcc";
var reg = /(\w)\1(\w)\2(\w)\3/;
str.replace(reg,'"$3""$3""$2""$2""$1""$1"');
replace函数,第二个参数你也可以自己用$
,$
就是你的正则中的字表达式,当前$3
表示第三个字表达是第三个字表达是匹配出来的是c
第二个$3
匹配出来的子表达式是c
,那么以此类推。
那么结果就是ccbbaa
当你不写回调函数的时候,并且当你正则中是有字表达式的时候,$3
表示第3个子表达式,$2
表示第二个子表达式,$1
是表示第三个子表达式。。。以此类推
$
可以算是一个变量,表示的是字表达式中匹配出来的字符
补充 str.replace
( 字符串1/正则 ,字符串2/回调函数//"$1"/"$1"… ) 用字符串2替换字符串1
reg.exec(str)
方法
var str = "huasheng";
var reg = /h/g;
console.log(str.match(reg))
这个match
方法是一次都符合条件的字符都匹配出来了并且放在数组中
那么我想第一次符合条件的字符放置在数组中,然后再次匹配符合条件放置在数组中,那该怎么办
reg.lastIndex
记录下次要匹配的索引位置(可读可写) (默认是0)
reg.exec(str)
从索引lastIndex
位置开始匹配符合正则规则的字符
var str = "huasheng";
var reg = /h/g;
console.log(reg.exec(str))
console.log(reg.lastIndex)
console.log(reg.exec(str))
console.log(reg.lastIndex)
第一次调用exec
这个方法时,索引0的位置上匹配到了h
,我把匹配好了的字符放置在数组中并且索引也给你记录一下,就是索引0的位置上匹配到了h
,lastIndex
这个方法表示你下一次执行的时候索引的位置
在索引0匹配到了h
,lastIndex
方法下一次匹配是从索引1开始匹配的,在索引4匹配到了h
,lastIndex
方法下一次匹配是从索引5开始匹配的
没有匹配到是null
那么lastIndex
就会重新归位到索引0,从索引0开始匹配
那么reg.lastIndex
这个属性也可以写
var str = "huasheng";
var reg = /h/g;
console.log(reg.exec(str))
console.log(reg.lastIndex = 4)
console.log(reg.exec(str))
console.log(reg.lastIndex)
修改了exec
的下一次匹配的位置是索引4开始匹配的
转义符号
var str = "huash$eng";
var reg = /$/;
console.log(str.match(reg));
为什么?
因为$
符合在正则中有特殊意义的,他是一个形容词他是能够修饰一个字符的,在结尾位置匹配的字符
那怎么让有特殊意义的字符没有特殊意义呢??
var str = "huash$eng";
var reg = /\$/;
console.log(str.match(reg));
在索引5匹配出来了$
符合了
在正则中\
是有特殊意义的,他的特殊意义就是把有特殊意义的字符转义掉
var str = "\\";
console.log(str);
就是自己转自己
想要匹配正则中有特殊意义的符号,必须使用转移符号\
必须把特殊意义转义掉
补充
用构造函数的形式定义正则表达式
var newReg = new RegExp(x,'gi');
new RegExp(x,'gi')
是js内置的函数,第一个参数表示要匹配的字符,第二个参数表示修饰符。
那么通过构造函数创建的正则有什么好处呢??
var y = "fkhsafh";//要匹配的字符串
var x = 'f';//要匹配的字符
var newReg = new RegExp(x,'gi');//定义正则
console.log(x.match(newReg));
好处就是构造函数形式定义的正则里面的第一个参数是可以写变量的,而字面量形式是无法接受变量的
两则最大区别就是,构造函数定义的正则可以接收变量,字面量形式定义的正则无法接收变量
补充
元字符\b
(是border单词的首字母)
\b
,他是一个形容词,形容一个字母处在单词边界的
var m = "cat";
m.match(/\bc/)
作为单词边界的c
在索引0的位置找到了
var m = "I hove cat";
m.match(/\bc/)
在JS中被空格个开的,一段字母那么这个字母就是单词
作为单词边界的c
在索引7的位置找到了(空格也算索引位置)
\n
换行符和m
换行匹配
var n = "huange\nhahus";
var nstr = /h/gm;
console.log(n.match(nstr));