一.啥是正则表达式
正则表达式(regular expression)是一个描述字符模式的对象,一般的用于检验字符串
二.正则表达式的语法
1.常用的普通字符
正则表达式 | 含义 |
[] | 表示任意一个字符 |
[abc] | 表示a、b、c中任意一个字符(表示该字符是a或b或c) |
[^abc] | 除了a、b、c的任意一个字符(表示该字符不能是a或b或c) |
[a-z] | 表示从a到z中的任意一个字符(表示任意一个小写英文字母 |
[h-z] | 表示从h到z中的任意一个字符(表示从h到z中的任意一个小写英文字母) |
[A-Z] | 表示从A到Z中的任意一个字符(表示任意一个大写英文字母) |
[1234] | 表示1、2、3、4中任意一个字符(表示该字符是1或2或3或4) |
[^1234] | 除了1、2、3、4的任意一个字符(表示该字符不能是1或2或3或4) |
[0-9] | 表示从0到9中的任意一个字符(表示任意一个数字) |
[a-zA-Z0-9_] | 表示a到z、A到Z、0到9以及下滑线中的任意一个字符 |
[a-z&&[^ bc]] | 表示**a到z**中**除了b、c**的任意一个字符,&&表示“与”的关系 |
2.常用的转义字符
正则表达式 | 含义 |
. | 表示任意一个字符 |
\d | 表示任意一个数字字符,相当于[0-9] |
\D | 表示任意一个非数字字符,相当于 [^ 0-9] |
\s | 表示任意一个空白字符,包括空格、制表符、换页符等等。 |
\S | 表示任意一个非空白字符,相当于[`^`\s] |
\w | 表示任意一个单词字符,相当于[a-zA-Z0-9_] |
\W | 表示任意一个非单词字符,相当于[^ \w] |
3.常用限定符
正则表达式 | 含义 |
? | 表示前面的内容出现0到1次(\w?表示出现0-1个单词字符) |
* | 表示前面的内容出现0到多次(\d*表示出现任意次数字) |
+ | 表示前面的内容出现1到多次(\s+表示至少出现一个空白) |
{n} | 表示前面的字符重复n次(\d{11}表示出现11位数字) |
{n,} | 表示前面的字符至少重复n次(\d{11,}表示出现11位或以上数字) |
{n,m} | 表示前面的字符至少重复n次,并且小于等于m次,即X>=n && X<=m([a-zA-Z0-9]{6,15}表示数字和字母的组合出现6-15位) |
4.常用定位符
正则表达式 | 含义 |
^ | 表示字符串必须以其后面约束的内容开始。当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合 |
$ | 表示字符串必须以其前面约束的内容结尾 |
5.练习:
能够匹配数字: \d+
能够匹配三位数字:\d{3}
至少匹配三位数字:\d{3,}
能够匹配到3到6位数字:\d{3,6}
能够匹配到正整数:/^[1-9]\d*$/
能够匹配到负整数:/^-[1-9]\d*$/
能够匹配到非正整数:/^[1-9]\d*|0$/
能够匹配到负整数:/^-[1-9]\d*|0$/
12个月的正则表达式:/^[0][1-9]|[1][0-2]$/
验证日期格式(2021-07-09):/^[2][0]\d{2}-([0][1-9]|[1][0-2])-([0][1-9]|[3][0-1]|[1-2]\d)$/
三.创建正则表达式
1.var box = new RegExp('box'); 第一个参数字符串
2.var box = new RegExp('box', 'ig'); 第二个参数可选模式修饰符
修饰符 | 描述 |
i | 执行对大小写不敏感的匹配 |
g | 执行全局匹配 |
m | 执行多行匹配 |
<script type="text/javascript">
/* 1.字符串中不用加开始结束的/,但是表达式正文中的\必须使用\\,进行转义才能生效。 */
//var reg1 = /^[0-9]{3,6}$/; //3-6位数字
var reg1 = /^\d{3,6}$/; //3-6位数字
console.log(reg1);
console.log(reg1.toString()); // /^\d{3,6}$/
//var reg2=new RegExp("^[0-9]{3,6}$");//3-6位数字
var reg2 = new RegExp("^\\d{3,6}$"); //3-6位数字
console.log(reg2);
console.log(reg2.toString()); // /^\d{3,6}$/
</script>
四.正则表达式的方法
1.RegExpObject.test() 方法
检测一个字符串是否匹配当前正则表达式,如果字符串中有匹配的值返回 true ,否则返回 false。 即如果字符串string中含有与RegExpObject匹配的文本则返回true,否则返回false。
<script type="text/javascript">
var reg = /hello/i;
var a = reg.test('hello,world')
var a1 = reg.test('add')
console.log(a); //true
console.log(a1); //false
var reg1 = /^[1-9]\d{4,}$/;
var b = reg1.test('123434')
console.log(b); //true
var reg2 = new RegExp('^[1-9]\\d{4,}$');
var c = reg2.test(12311);
console.log(c); //true
var reg3 = /^[1][358]\d{9}$/; //前后同时产生(严格匹配)
// var reg3 = /^[1][358]\d{9}/; 从头开始
// var reg3 = /[1][358]\d{9}$/; 从后面开始
// var reg3 = /[1][358]\d{9}/; 前后都不写
var d = reg3.test("13456756412")
console.log(d); //true
</script>
2.RegExpObject.exec() 方法
检索字符串中的正则表达式的匹配,如果字符串中有匹配的值返回该匹配值,否则返回 null
<script type="text/javascript">
var reg = /hello/gi;
var a = reg.exec('hello ddd world');
var b = reg.exec('woshui shi wi');
console.log(b); // null
console.log(a); // ["hello", index: 0, input: "hello ddd world"]
console.log(a.toString()); // hello
</script>
五.String对象中支持正则表达式的方法
1.stringObj.search()
检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。返回与指定查找的字符串或者正则表达式相匹配的首个String 对象起始位置。如果没有找到任何匹配的子串,则返回 -1。
<script type="text/javascript">
/* 1.search方法可使用字符串作为参数,字符串参数会转换为正则表达式 */
var str = "what is the matter with you";
var n2 = str.search("the");
console.log(n2); //8
/* 2.使用正则表达式搜索"is"字符串,且不区分大小写 */
var str = "what is the matter with you";
var n = str.search(/is/i);
console.log(n); //1
/* 3.获取与正则表达式reg相匹配的首个String对象起始位置 */
var reg = /a[t]+/i;
var str = "what is the matter with you "
var n = str.search(reg);
console.log(n); //2
</script>
2.stringObj.split(bystr ,limit)
把一个字符串分割成字符串数组。该方法不改变原始字符串。
如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
bystr 可选**字符串**或**正则表达式**,从该参数指定的地方分割 stringObj。
limit可选,该参数可**指定返回的数组的最大长度**。
如果设置了该参数,返回的子串不会多于这个参数指定的数组。
如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
<script type="text/javascript">
/* 1.用字符串分割,并指定返回的数组的最大长度为3 */
var str = "How are you doing today?";
var n = str.split(" ", 3);
console.log(n); // ["How", "are", "you"]
console.log(n.toString()); //How,are,you
/* 2.用正则表达式分割,并指定返回的数组的最大长度为3 */
var str = "How are you doing today?";
var n = str.split(/\s/, 3); // \s表示任意一个空格
console.log(n); // ["How", "are", "you"]
console.log(n.toString()); //How,are,you
</script>
3.stringObj.replace(findstr,tostr)
在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。该方法不会改变原始字符串。 返回一个新的字符串,是用 tostr 替换了 findstr的第一次匹配或所有匹配之后得到的
<script type="text/javascript">
var str = 'How are you doing today';
var str1 = str.replace(/o/i,'oo');
var str2 = str.replace(/o/g,'oo');
console.log(str); // How are you doing today
console.log(str1); // Hoow are you doing today
console.log(str2); // Hoow are yoou dooing tooday
</script>
4.stringObj.match(regexp)
在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
match() 方法将检索字符串 StringObj,以找到一个或多个与 regexp 匹配的文本
这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g
如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配
如果没有找到任何匹配的文本, match() 将返回 null
否则,它将**返回一个数组**,其中存放了与它找到的匹配文本有关的信息
<script type="text/javascript">
var str = "The rain in SPAIN stays mainly in the plain";
var str1 = str.match(/ain/g);
console.log(str1); //["ain", "ain", "ain"]
console.log(str1.toString()); //["ain", "ain", "ain"]
/* 不区分大小写 */
var str2 = str.match(/ain/gi)
console.log(str2); // ["ain", "AIN", "ain", "ain"]
console.log(str2.toString()); // ain,AIN,ain,ain
</script>
练习:
1.有字符串var str = "abc123de45f6"; 运用正则表达式实现如下结果:
返回数字的首字符位置索引;将所有的数字替换为*;将所有的字母a替换为#;返回其中所有数字组成的数组
<script type="text/javascript">
//用正则表达式的方法
var str = "abc123de45f6";
var str1 = '';
var reg = /\d/;
var count = str.search(/\d/i)
console.log(count); // 3
var str1 = str.replace(/\d/g,'*')
console.log(str1); // abc***de**f*
var str2 = str.replace(/a/g,'#');
console.log(str2); //#bc123de45f6
var str3 = str.match(/\d/gi);
console.log(str3); // ["1", "2", "3", "4", "5", "6"]
</script>
<script type="text/javascript">
//用普通的方法
var str = "abc123de45f6";
var str1 = ''; /* 数字变成*号 */
var str2 = ''; /* 将字符串a变成# */
var str3 = ''; /* 将数字提取出来变成新数组 */
var reg = /\d+/;
for(var i = 0;i<str.length;i++){
var res = reg.test(str[i])
if(res == true){
console.log(i);
str1 = str1 + '*';
str3 = str3 + str[i]
} else {
str1 = str1 + str[i]
}
if(str[i] == 'a'){
str2 = str2 + '#';
}else{
str2 = str2 + str[i];
}
}
console.log(str1);
console.log(str2);
console.log(str3);
</script>