web前端-js小记(7)-正则表达式

0、\d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^,$分别是什么?

符号 含义
\d [0-9] 表示数字字符
\w [a-zA-Z0-9_] 表示数字,大小写字母及下划线
\s [\t\n\x0B\f\r] 表示空白符
[a-zA-Z0-9] 表示大小写字母,数字字符
\b 表示单词边界
. 表示除回车符换行符的所有字符
* 出现0次或多次(任意次)
+ 出现1一次或多次(最少出现一次)
? 出现0次或1次(最多出现一次)
x{3} 表示x字符出现3次
^ 以什么字符做为开头
$ 以什么字符做为结尾
[^abc] 表示不是abc的所有字符
abc{3,5}? ?在量词后面表示非贪婪模式,若字符串匹配,c取3个
(abc){10} 表示abc字符连续出现10次
abc(?=def) 匹配后面为def的abc

1、RegExp 相关方法

  1. RegExp.prototype.test(str)
//测试字符串参数中是否存正则表达式模式,如果存在则返回true
var reg = /\d+\.\d{1,2}$/g;
reg.test('123.45'); //true
reg.test('34.5678'); //false
  1. RegExp.prototype.exec(str)
//用的不多
//正则表达式模式在字符串中查找,若找到了匹配的,返回一个结果数组,否则返回null
var reg = /\d/g;
var r = reg.exec('a1b2c3');
  1. String.prototype.search(reg)
//检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,忽略标志g,返回字符串的第一个匹配的位置
'a1b2c3'.search(/\d/g); //1
'a1b2c3'.search(/\d/); //1
  1. String.prototype.match(reg)
//非全局调用:只能执行一次匹配,返回数组,第一个元素存放的是匹配文本,第二个元素存放index,是匹配文本的起始字符在字符串中的位置,第三个元素存放input,是检索的字符串
var r = 'aaa123456'.match(/\d/);   //["1", index: 3, input: "aaa123456"]

//全局调用:返回数组,存放的是字符串中所有的匹配子串,没有index和input
var r = 'aaa123456'.match(/\d/g);  //["1", "2", "3", "4", "5", "6"]
  1. String.prototype.replace(reg, replaceStr)
//1、string对象的replace方法,我们最常用的是传入两个字符串的做法,但这种做法有个缺陷,只能replace一次
// 2、replace方法的第一个参数还可以传入RegExp对象,可以进行全局替换

'abcabcabc'.replace('bc','X'); //aXabcabc
'abcabcabc'.replace(/bc/g,'X'); //aXaXaX
  1. String.prototype.split(reg)
//和replace方法类似,在一些复杂的分割情况下我们可以使用正则表达式解决。
'a,b,c,d'.split(',');   //["a", "b", "c", "d"];
'a1b2c3d'.split(/\d/);   //["a", "b", "c", "d"]

2、写一个函数trim(str),去除字符串两边的空白字符

function trim(str){
  var reg=/(^\s+|\s+$)/g;
  return str.replace(reg,"");
}
var result=trim("  345");
var result1=trim("\nabs");

3、写一个函数isEmail(str),判断用户输入的是不是邮箱

function isEmail(str){
  var reg=/\w+@[0-9a-zA-Z]+[.][a-z]+/g;
  return reg.test(str);
}
var result1=isEmail("[email protected]");
var result2=isEmail("[email protected]");

4、写一个函数isPhoneNum(str),判断用户输入的是不是手机号

function isPhoneNum(str){
  var reg=/^1\d{10}$/g;
  return reg.test(str);
}
var result1=isPhoneNum("1205425879a");
var result2=isPhoneNum("12457896312a");
var result3=isPhoneNum("12012456789");

5、写一个函数isValidUsername(str),判断用户输入的是不是合法的用户名(长度6-20个字符,只能包括字母、数字、下划线)

function isValidUsername(str){
  var reg=/^\w{6,20}$/g;
  return reg.test(str);
}
var result1=isValidUsername("ast");
var result2=isValidUsername("astsdg/n");
var result3=isValidUsername("astsd/n");
var result4=isValidUsername("astsdg");
var result5=isValidUsername("astsdgastsdgastsdgsd");

6、写一个函数isValidPassword(str), 判断用户输入的是不是合法密码(长度6-20个字符,只包括大写字母、小写字母、数字、下划线,且至少包括两种)

function isValidPassword(str){
  if(!/^\w{6,20}$/.test(str)) return false;
  if(/^\d{6,20}$/.test(str)|/^[a-z]{6,20}$/.test(str)|/^[A-Z]{6,20}$/.test(str)|/^_{6,20}$/.test(str)) return false;
  return true;
}
var result1=isValidPassword("abretedggdfgfg");
var result2=isValidPassword("456456dfgdfg");
var result3=isValidPassword("____________");

7、写一个正则表达式,得到如下字符串里所有的颜色

var re = /(#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})(?=;))/g
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee "
console.log(subj.match(re))  // ['#121212', '#AA00ef']

8、下面代码输出什么? 为什么? 改写代码,让其输出[""hunger"", ""world""].

var str = 'hello  "hunger" , hello "world"';
var pat =  /".*"/g;
str.match(pat); 

输出[""hunger" , hello "world""]
原因:因为.表示除了回车符和换行符的所有字符,代表出现0次或多次,而且后面没有?,说明是贪婪模式,是竟可能多的匹配,g代表全局搜索,所以得到这结果

var str = 'hello  "hunger" , hello "world"';
var pat =  /".*?"/g;     //?表示非贪婪模式的匹配,匹配中用尽可能少的次数去匹配,所以得到不同结果
str.match(pat); 

(mission 7)

你可能感兴趣的:(web前端-js小记(7)-正则表达式)