JavaWeb项目之尚硅谷书城:(二)正则表达式

2.1 从凤姐的择偶标准说起

images

本人对伴侣要求如下:

  • 第一、必须为北京大学或清华大学硕士毕业生。必须本科硕士连读,中途无跳级,不留级,不转校。在外参加工作后再回校读书者免。
  • 第二、必须为经济学专业毕业。非经济学专业毕业则必须精通经济学。或对经济学有浓厚的兴趣。
  • 第三、必须具备国际视野,但是无长期定居国外甚至移民的打算。
  • 第四、身高176–183左右。长得越帅越好。
  • 第五、无生育史。过往所有女友均无因自身而致的堕胎史。
  • 第六、东部户籍,即江、浙、沪三地户籍或黑龙江、广东、天津、山东、北京、吉林、辽宁等。
  • 东北三省和内蒙古等地户籍,西南地区即重庆、贵州、云南、西藏和湖南、湖北等地籍贯者不予考虑。
  • 第七、年龄25–28岁左右。即06届,07届,08届,09届毕业生。有一至两年的工作经验,06级毕业生需年龄在28岁左右,09级毕业生则需聪明过人。且具备丰富的社会实践经验。就职于国家机关,国有企事业单位者不愿考虑。但就职于中石油,中石化等世界顶尖型企业或银行者又比较喜欢。现自主创业者要商榷一番了。

2.2 正则表达式的概念

使用一段字符串定义的一个规则,用以检测某个字符串是否满足这个规则,或将目标字符串中满足规则的部分读取出来,又或者将目标字符串中满足标准的部分替换为其他字符串。所以正则表达式有三个主要用途:

  • 模式验证
  • 匹配读取
  • 匹配替换

image-20220717182727696

2.3 JavaScript中的正则表达式

  1. 创建正则表达式对象

    • 使用两个斜杠

      // 类似创建数组时可以使用[]、创建对象可以使用{}
      var reg = /a/;
      
    • 使用new关键字创建RegExp类型的对象

      // 类似创建数组可以new Array()、创建对象可以使用new Object()
      var reg = new RegExp("a");
      
  2. 正则表达式的组成

    正则表达式本身也是一个字符串,它由两种字符组成:

    • 普通字符,例如大、小写英文字母;数字等。
    • 元字符:被系统赋予特殊含义的字符。例如:^表示以某个字符串开始,$表示以某个字符串结束。

2.4 正则表达式初体验

  1. 模式验证

    注意:这里是使用正则表达式对象调用方法。

    // 创建一个最简单的正则表达式对象
    var reg = /o/;
    
    // 创建一个字符串对象作为目标字符串
    var str = 'Hello World!';
    
    // 调用正则表达式对象的test()方法验证目标字符串是否满足我们指定的这个模式,返回结果true
    console.log("/o/.test('Hello World!')="+reg.test(str));
    
  2. 匹配读取

    注意:这里是使用字符串对象调用方法。

    // 在目标字符串中查找匹配的字符,返回匹配结果组成的数组
    var resultArr = str.match(reg);
    // 数组长度为1
    console.log("resultArr.length="+resultArr.length);
    
    // 数组内容是o
    console.log("resultArr[0]="+resultArr[0]);
    
  3. 替换

    注意:这里是使用字符串对象调用方法。

    var newStr = str.replace(reg,'@');
    // 只有第一个o被替换了,说明我们这个正则表达式只能匹配第一个满足的字符串
    console.log("str.replace(reg)="+newStr);//Hell@ World!
    
    // 原字符串并没有变化,只是返回了一个新字符串
    console.log("str="+str);//str=Hello World!
    

2.5 匹配方式

2.5.1 全文查找

如果不使用g对正则表达式对象进行修饰,则使用正则表达式进行查找时,仅返回第一个匹配;使用g后,返回所有匹配。

// 目标字符串
var targetStr = 'Hello World!';

// 没有使用全局匹配的正则表达式
var reg = /[A-Z]/;
// 获取全部匹配
var resultArr = targetStr.match(reg);
// 数组长度为1
console.log("resultArr.length="+resultArr.length);

// 遍历数组,发现只能得到'H'
for(var i = 0; i < resultArr.length; i++){
	console.log("resultArr["+i+"]="+resultArr[i]);
}

对比代码:

// 目标字符串
var targetStr = 'Hello World!';

// 使用了全局匹配的正则表达式
var reg = /[A-Z]/g;
// 获取全部匹配
var resultArr = targetStr.match(reg);
// 数组长度为2
console.log("resultArr.length="+resultArr.length);

// 遍历数组,发现可以获取到“H”和“W”
for(var i = 0; i < resultArr.length; i++){
	console.log("resultArr["+i+"]="+resultArr[i]);
}

2.5.2 忽略大小写

//目标字符串
var targetStr = 'Hello WORLD!';

//没有使用忽略大小写的正则表达式
var reg = /o/g;
//获取全部匹配
var resultArr = targetStr.match(reg);
//数组长度为1
console.log("resultArr.length="+resultArr.length);
//遍历数组,仅得到'o'
for(var i = 0; i < resultArr.length; i++){
	console.log("resultArr["+i+"]="+resultArr[i]);
}

对比代码:

//目标字符串
var targetStr = 'Hello WORLD!';

//使用了忽略大小写的正则表达式
var reg = /o/gi;
//获取全部匹配
var resultArr = targetStr.match(reg);
//数组长度为2
console.log("resultArr.length="+resultArr.length);
//遍历数组,得到'o'和'O'
for(var i = 0; i < resultArr.length; i++){
	console.log("resultArr["+i+"]="+resultArr[i]);
}

2.5.3 多行查找

不使用多行查找模式,目标字符串中不管有没有换行符都会被当作一行。

//目标字符串1
var targetStr01 = 'Hello\nWorld!';
//目标字符串2
var targetStr02 = 'Hello';

//匹配以'Hello'结尾的正则表达式,没有使用多行匹配
var reg = /Hello$/;
console.log(reg.test(targetStr01));//false

console.log(reg.test(targetStr02));//true

对比代码:

//目标字符串1
var targetStr01 = 'Hello\nWorld!';
//目标字符串2
var targetStr02 = 'Hello';

//匹配以'Hello'结尾的正则表达式,使用了多行匹配
var reg = /Hello$/m;
console.log(reg.test(targetStr01));//true

console.log(reg.test(targetStr02));//true

2.6 元字符

2.6.1 概念

在正则表达式中被赋予特殊含义的字符,不能被直接当做普通字符使用。如果要匹配元字符本身,需要对元字符进行转义,转义的方式是在元字符前面加上“\”,例如:^

2.6.2 常用元字符

代码说明
.匹配除换行字符以外的任意字符。
\w匹配字母或数字或下划线等价于[a-zA-Z0-9_]
\W匹配任何非单词字符。等价于[^A-Za-z0-9_]
\s匹配任意的空白符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。
\S匹配任何非空白字符。等价于[^\f\n\r\t\v]。
\d匹配数字。等价于[0-9]。
\D匹配一个非数字字符。等价于[^0-9]
\b匹配单词的开始或结束
^匹配字符串的开始,但在[]中使用表示取反
$匹配字符串的结束

例1

var str = 'one two three four';
// 匹配全部空格
var reg = /\s/g;
// 将空格替换为@
var newStr = str.replace(reg,'@'); // one@two@three@four
console.log("newStr="+newStr);

例2

var str = '今年是2014年';
// 匹配至少一个数字
var reg = /\d+/g;
str = str.replace(reg,'abcd');
console.log('str='+str); // 今年是abcd年

例3

var str01 = 'I love Java';
var str02 = 'Java love me';
// 匹配以Java开头
var reg = /^Java/g;
console.log('reg.test(str01)='+reg.test(str01)); // false
console.log("<br />");
console.log('reg.test(str02)='+reg.test(str02)); // true

例4

var str01 = 'I love Java';
var str02 = 'Java love me';
// 匹配以Java结尾
var reg = /Java$/g;
console.log('reg.test(str01)='+reg.test(str01)); // true
console.log("<br />");
console.log('reg.test(str02)='+reg.test(str02)); // flase

2.7 字符集合

语法格式示例说明
[字符列表]正则表达式:[abc] 含义:目标字符串包含abc中的任何一个字符 目标字符串:plain 是否匹配:是 原因:plain中的“a”在列表“abc”中目标字符串中任何一个字符出现在字符列表中就算匹配。
[^字符列表][^abc] 含义:目标字符串包含abc以外的任何一个字符 目标字符串:plain 是否匹配:是 原因:plain中包含“p”、“l”、“i”、“n”匹配字符列表中未包含的任意字符。
[字符范围]正则表达式:[a-z] 含义:所有小写英文字符组成的字符列表 正则表达式:[A-Z] 含义:所有大写英文字符组成的字符列表匹配指定范围内的任意字符。
var str01 = 'Hello World';
var str02 = 'I am Tom';
//匹配abc中的任何一个
var reg = /[abc]/g;
console.log('reg.test(str01)='+reg.test(str01));//flase
console.log('reg.test(str02)='+reg.test(str02));//true

2.8 重复

代码说明
*重复零次或多次
+重复一次或多次
?重复零次或一次
{n}重复n次
{n,}重复n次或多次
{n,m}重复n到m次
console.log("/[a]{3}/.test('aa')="+/[a]{3}/g.test('aa')); // flase
console.log("/[a]{3}/.test('aaa')="+/[a]{3}/g.test('aaa')); // true
console.log("/[a]{3}/.test('aaaa')="+/[a]{3}/g.test('aaaa')); // true

2.9 在正则表达式中表达"或者"

使用符号:|

// 目标字符串
var str01 = 'Hello World!';
var str02 = 'I love Java';
// 匹配'World'或'Java'
var reg = /World|Java/g;
console.log("str01.match(reg)[0]="+str01.match(reg)[0]);//World
console.log("str02.match(reg)[0]="+str02.match(reg)[0]);//Java

2.10 常用正则表达式

需求正则表达式
用户名/^[a-zA-Z_][a-zA-Z_-0-9]{5,9}$/
密码/^[a-zA-Z0-9_-@#&*]{6,12}$/
前后空格/^\s+|\s+$/g
电子邮箱/^[a-zA-Z0-9_.-]+@([a-zA-Z0-9-]+[.]{1})+[a-zA-Z]+$/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值