Javascript教程(十二)——通俗易懂的正则表达式!!!

一、正则表达式

正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,获取将字符串中符合规则的内容提取出来

1、创建正则表达式的对象

  • 语法:
    • var 变量 = new RegExp("正则表达式","匹配模式");
    • 使用typeof检查正则对象,会返回object
	var reg = new RegExp("a");     //这个正则表达式可以来检查一个字符串中是否含有a
	console.log(reg);   //结果 "/a/"
	console.log(typeof reg);   //结果 object
  • 在构造函数中可以传递一个匹配模式作为第二个参数,
  • 可以是
    • i 忽略大小写
    • g 全局匹配模式
	var reg2 = new RegExp("ab","i");

那么如何去检测正则表达式规定的规则呢?

  • 正则表达式的方法:
  • test()
    • 使用这个方法可以用来检查一个字符串是否符合正则表达式的规则,
    • 如果符合则返回true,否则返回false
    var reg = new RegExp("a");     //这个正则表达式可以来检查一个字符串中是否含有a
	var str  = "abcd";
	var result = reg.test(str);
	console.log(result);   //true
	
	var reg2 = new RegExp("ab","i");
	console.log(reg2.test("Ac"));    // false
	console.log(reg2.test("Ab"));    // true

2、使用字面量创建正则表达式

  • 语法:
    • var 变量 = /正则表达式/匹配模式
    • 使用字面量的方式创建更加简单
      使用构造函数创建更加灵活,因为可以向构造函数传一个变量,变量是什么,正则就是什么,所以更加灵活
var reg = new RegExp("a","i");
			
var reg = /a/i;

// 以上两种写法一模一样
创建一个正则表达式,检查一个字符串中是否有a或b
/*
 * 使用 | 表示或者的意思
 */
reg = /a|b|c/;
创建一个正则表达式检查一个字符串中是否有字母
/*
 * []里的内容也是或的关系
 * [ab] == a|b
 * [a-z] 任意小写字母
 * [A-Z] 任意大写字母
 * [A-z] 任意字母
 * [0-9] 任意数字
 */
reg = /[A-z]/;
reg = /[0-9]/;
检查一个字符串中是否含有 abc 或 adc 或 aec
reg = /a[bde]c/;
除了 [^ ]
reg = /[^ab]/;   //除了ab以外的 ,都可以
console.log(reg.test("abc")) ;  //这也是true
console.log(reg.test("ab")) ;  //这是
===============================================
reg = /[^0-9]/;
console.log(reg.test("12a3456"));

3、字符串和正则相关的方法

split()
  • 可以将一个字符串拆分为一个数组
  • 方法中可以传递一个正则表达式作为参数,这样方法将会根据正则表达式去拆分字符串
  • 这个方法即使不指定全局匹配,也会全都插分
var str = "1a2b3c4d5e6f7";
/*
 * 根据任意字母来将字符串拆分
 */
var result = str.split(/[A-z]/);
console.log(result);  //"1,2,3,4,5,6,7"
search()
  • 可以搜索字符串中是否含有指定内容
  • 如果搜索到指定内容,则会返回第一次出现的索引,如果没有搜索到返回-1
  • 它可以接受一个正则表达式作为参数,然后会根据正则表达式去检索字符串
  • search()只会查找第一个,即使设置全局匹配也没用
str = "hello abc hello aec afc";
console.log(str.search("abc"));   //找到第一个str中第一个abc,索引为6,所以这行打印6
/*
 * 搜索字符串中是否含有abc 或 aec 或 afc
 */
result = str.search(/a[bef]c/);
console.log(result); //会打印6,因为先找到了abc,如果没有abc才会继续往后找aec
match()
  • 根据正则表达式,从一个字符串中将符合条件的内容提取出来
  • 默认情况下我们的match只会找到第一个符合要求的内容,找到以后就停止检索
    • 我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容
    • 可以为一个正则表达式设置多个匹配模式,且顺序无所谓
    • match()会将匹配到的内容封装到一个数组中返回,即使只查询到一个结果
str = "1a2a3a4a5e6f7A8B9C";
result = str.match(/[A-z]/);
console.log(result);  //这是没有设置的默认情况,只找到第一个符合要求的,也就是a		

result1 = str.match(/[a-z]/ig);  //i忽略大小写,g全局模式
console.log(result1);  //"a,a,a,a,e,f,A,B,C"

console.log(Array.isArray(result1)); //true,  result1是一个数组,存储了匹配到的内容
replace()
  • 字符串中指定内容替换为新的内容
  • 参数:
    1. 被替换的内容,可以接受一个正则表达式作为参数
    2. 新的内容
  • 默认只会替换第一个
str = "1a2a3a4";
			
result = str.replace(/[a-z]/gi , "@_@");
console.log(result); //"1@_@2@_@3@_@4"

result = str.replace(/[a-z]/gi , "");
			
console.log(result);  //"1234"	

4、正则表达式语法

量词

/*
 * 创建一个正则表达式检查一个字符串中是否含有aaa
 */
 var reg = /aaa/;

但如果我们要很多很多a,难道要/aaaaaaaaaaaaaaaa/这样写吗?
这就引入了量词

量词语法

  • 通过量词可以设置一个内容出现的次数
  • 量词只对它前边的一个内容起作用
    • {n} 正好出现n次
    • {m,n} 出现m-n次
    • {m,} m次以上
    • +至少1次 相当于 {1,}
    • ? 0次或1次 相当于 {0,1}
    • *0次或多次 相当于 {0,}
//aaa
var reg = /a{3}/;
//ababab
reg = /(ab){3}/;
			
reg = /ab{1,3}c/;  //abc或abbc或abbbc

reg = /ab{3,}c/;  //ab出现3次及以上c

reg = /ab+c/; //b至少1次 

reg = /ab*c/;  //b出现0次或多次

reg = /ab?c/;  //b出现0次或1次

检查一个字符串中是否以a开头

  • ^ 表示开头
  • $ 表示结尾
reg = /^a/; //匹配开头的a
console.log(reg.test("abcabca"));	//true
console.log(reg.test("bcabca")); //false

reg = /a$/; //匹配结尾的a
console.log(reg.test("abcabca"));	//true
console.log(reg.test("bcabc")); //false
			
/*
 * 如果在正则表达式中同时使用^ $则要求字符串必须完全符合正则表达式
*/
reg = /^a$/;  //a既得是开头也得是结尾,所以只有a符合,其他都是false
			
console.log(reg.test("aaa"));  //false
console.log(reg.test("a"));  //true	

reg = /^a|a$/;  //以a开头或以a结尾
			
console.log(reg.test("aaa"));  //true
console.log(reg.test("bbca"));  //true	

小练习

  • 创建一个正则表达式,用来检查一个字符串是否是一个合法手机号
  • 手机号的规则:
  • 1 3 567890123 (11位)
    1. 以1开头
    2. 第二位3-9任意数字
    3. 三位以后任意数字9个
  • ^1 [3-9] [0-9]{9}$
var phoneStr = "13067890123";
			
var phoneReg = /^1[3-9][0-9]{9}$/;
			
console.log(phoneReg.test(phoneStr)); //true

phoneStr = "11067890123";
console.log(phoneReg.test(phoneStr)); //false

转义字符

当我们想检查一个字符串中是否含有 . 时,不能直接var reg = /./,因为 . 表示任意字符
console.log(reg.test("abc")) //这样也是true
所以有些时候,字符代表了特殊含义,想让他表示成原本的意义时就需要转义

  • 在正则表达式中使用 \ 作为转义字符
    • . 来表示.

    • \ 表示\

    • 注意:使用构造函数时,由于它的参数是一个字符串,而\是字符串中转义字符,如果要使用\则需要使用\来代替

var reg = /\./;
reg = /\\/;
			
reg = new RegExp("\\.");  //要用两个\\代表转义字符\  相当于var reg = /\./;
reg = new RegExp("\\\\"); //要用两个\\代表转义字符\  相当于var reg = /\\/;
  • \w
    • 任意字母、数字、_ 相当于 [A-z0-9_]
  • \W
    • 除了字母、数字、_ 相当于 [^A-z0-9_]
  • \d
    • 任意的数字 [0-9]
  • \D
    • 除了数字 [^0-9]
  • \s
    • 空格
  • \S
    • 除了空格
  • \b
    • 单词边界
  • \B
    • 除了单词边界
reg = /\w/;
reg = /\W/;

reg = /\d/;
reg = /\D/;

reg = /\s/;
reg = /\S/;

/*
 * 创建一个正则表达式检查一个字符串中是否含有单词child
 */
reg = /child/;			
console.log(reg.test("hellochildren "));  //只要含有child,结果就是true
						
reg = /\bchild\b/;
console.log(reg.test("hellochild "));  //false
console.log(reg.test("hello child "));  //true	
//接收一个用户的输入
//var str = prompt("请输入你的用户名:");

var str = "              he      llo                ";
console.log(str);

//去除掉字符串中的前后的空格
//去除空格就是使用""来替换空格
// str = str.replace(/\s/g , "");
// console.log(str); //hello,它会把中间的空格也去掉,就是所有的空格都去掉了

//去除开头的空格
str = str.replace(/^\s*/, "");  //如果不加*,只会匹配开头的一个空格,所以是开头的多个空格,用*


//去除结尾的空格
//str = str.replace(/\s*$/, "");


// /^\s*|\s*$/g 匹配开头和结尾的空格,意思为去除开头或结尾的空格
// 加全局匹配时因为,|为或的意思,如果不全局匹配,reg认为去除完前面的空格了,就不继续匹配了
str = str.replace(/^\s*|\s*$/g,"");


console.log(str);

5、综合练习——邮件正则

电子邮件
hello . nihao @ abc . com . cn

  • 任意字母数字下划线 .任意字母数字下划线(整个这部分可有可无,所以用*) @ 任意字母数字(至少1位,所以用+) .任意字母(2-5位) .任意字母(2-5位) //后两部分整体出现1-2次,所以整体{1,2}
  • \w{3,} (.\w+)* @ [A-z0-9]+ (.[A-z]{2,5}){1,2}
	
var emailReg = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;
			
var email = "[email protected]";

console.log(emailReg.test(email)); //true

常用正则表达式

猜你喜欢

转载自blog.csdn.net/qq_32755875/article/details/113774258
今日推荐