一、认识正则表达式
1.正则表达式是描述字符模式的对象,正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。
String和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。
2. 正则表达式主要用来验证客户端的输入数据。可以节约大量的服务器端的系统资源,并且提供更好的用户体验。
3. 正则表达式其实就是一种规则,其实把正则称作规则表达式更为恰当。正则的语法基于一种古老的perl语言。
二、正则表达式的作用
- 提取字符串:从指定的字符串中将符合规则部分提取出来
- 匹配正则:判断一个字符串是否跟指定的规则匹配
- 替换字符串:将一个字符串中跟规则匹配的部分替换掉
三、正则表达式的创建
语法:/正则表达式主体/修饰符(可选)
字面量。语法:Reg = /pattern/modifiers; 字面量的正则由两个正斜杆组成//,第一个正斜杆后面写规则:/pattern[规则可以写各式各样的元字符|量词|字集|断言…]。第二个正斜杆后面写标识符/modifiers[g全局匹配 | i忽略大小写 | m换行匹配 | ^起始位置 | $结束位置] 标识符。
var reg = /hello/i; // 字面量方式
构造函数。语法 Reg = new RegExp( pattern , modifiers ); pattern ,modifiers此时是字符串。何种方法创建都是一样的,pattern 模式 模板,要匹配的内容,modifiers 修饰符。
var reg = new RegExp("hello","i") // 构造函数方式
使用说明:正则表达式比较特殊,不是字符串,不用加引号,但是要有定界符,两边都是斜杠。在斜杠后面可以加一些特定的修饰符。
修饰符
标志 | 说明 |
---|---|
i | 忽略大小写 |
g | 全局匹配,没有g只匹配第一个元素,就不在进行匹配,贪婪模式 |
gi | 全局匹配+忽略大小写 |
m | 执行多行匹配 |
正则表达式的组成:
- 普通字符
- 特殊字符(元字符):正则表达式中有特殊意义的字符
元字符
常用元字符串
限定符
^n 匹配以n开头的字符串
n$ 匹配以n结尾的字符串
[^n] ^出现中在[]中括号里表示取不包含n字符的字符串
n|m 匹配n或者m.两个只取一个
贪婪: 尽可能多的匹配 / 惰性: 尽可能少的匹配。
n+ 贪婪模式为默认
n+? 量词后面带?问号就是懒惰模式,以次类推
{n,m} 贪婪模式
{n,m}? 懒惰模式
var reg = /好{3}/;//查找出现3次的字符
var reg = /好{0,9}/;//匹配一个字符出现9次的,不行的话就递减 9 8 7 6 5 4 3 2 1 0(贪婪模式)
var reg = /好{1,9}/;//匹配一个字符出现1~9次的 先最大次数开始匹配(贪婪模式)
var reg = /好{1,}/;//最少出现一次,最多没有上限
var reg = /好{1,2}/;//最少出现一次,最多两次
var reg = /好*/;// 匹配0个或任意个字符串(任意个) {0,}
var reg = /好+/;//只是一个最多没有上限{1,}
var reg = /好?/;//可有可无 可以是没有也可以是1个 {0,1}
var reg = /好{3,9}/;//贪婪模式 往多的找
var reg = /好{2,9}?/;//惰性(懒惰)模式 往少的找
var reg = /好{2,9}?/g;//全局匹配
var reg = /^l\w+/gm;//查找l开头的任意字符
var reg = /\w+2$/gm;//任意字符后面是以2结束的字符
其它
-
[ ] 字符串用中括号括起来,表示匹配其中的任一字符,相当于或的意思
-
[^] 匹配除中括号以内的内容
-
() 从两个直接量中选择一个,分组
-
eg:gr(a|e)y匹配gray和grey
-
[\u4e00-\u9fa5] 匹配汉字
- | 或者,选择两者中的一个。注意|将左右两边分为两部分,而不管左右两边有多长多乱
- \ 转义符做为转意,即通常在"“后面的字符不按原来意义解释,如/d/匹配字符"d”,当b前面加了反斜杆后/\d/,转意为匹配数字。
var reg = /\./;//匹配.
var reg = /\\/;//匹配\
var reg = /\//;//匹配/
var str = '\\';
var reg = /\\/g;
console.log(reg.test(str)); //true
三、正则表达式用法及区别
String中正则表达式方法。
方法 | 描述 |
---|---|
String.match(Reg) | 返回RegExp匹配的包含全部字符串的数组或null |
String.search(Reg) | 返回RegExp匹配字符串首次出现的位置 |
String.replace(Reg, newStr) | 用newStr替换RegExp匹配结果,并返回新字符串 |
String.split(Reg) | 返回字符串按指定RegExp拆分的数组 |
var str = 'a1b2c3a4a5',
reg = /a/g;
console.log(str.match(reg)); //["a", "a", "a"]
var str = 'a1b2c3a4a5',
reg = /a/;
console.log(str.search(reg)); //0
var str = 'a1b2c3a4a5',
reg = /a/g;
console.log(str.replace(reg,function(){
console.log(arguments);
return 5555;}));
var str = 'a,b,c,d',
reg = /,/g;//console.log(str.split(',')); //["a", "b", "c", "d"]
console.log(str.split(reg)) //["a", "b", "c", "d"]
RegExp对象的方法
方法 | 描述 |
---|---|
RegExp.exec(String) | 在字符串中执行匹配搜索,返回首次匹配结果数组 |
RegExp.test(String) | 在字符串中测试模式匹配,返回true或false |
var str = 'abcd',
reg = /\w/g;
console.log(reg.exec(str)); //["a", index: 0, input: "abcd", groups: undefined]
console.log(reg.exec(str)); //["b", index: 1, input: "abcd", groups: undefined]
console.log(reg.exec(str)); //["c", index: 2, input: "abcd", groups: undefined]
console.log(reg.exec(str)); //["d", index: 3, input: "abcd", groups: undefined]
console.log(reg.exec(str)); //null
console.log(reg.exec(str)); //["a", index: 0, input: "abcd", groups: undefined]
var str = 'abcd',
reg = /7/g;
console.log(reg.test(str)); //false
四、断言/前瞻
正则表达式中,用于查找某些内容之前(前瞻)或者之后(后顾)的东西,叫做断言。JavaScript只有前瞻,并没有后顾。
零宽度,说明它是不占字符宽度的,只是一个位置,它不匹配任何东西。(?=pattern) 零宽正向断言 ,(?!pattern) 零宽负向断言。
//匹配 “iPhone8” 中的 “iPhone” ,不匹配 “iPhone7” 中的 “iPhone”。
iPhone(?=8) //匹配windows且后面跟8
//匹配 “iPhone7” 中的 “iPhone” ,不匹配 “iPhone8” 中的 “iPhone”。
Windows (?!8)//匹配windows且后面非8
案例(仅供参考)
手机号检测
var reg = /^1[345789]\d{9}$/;
验证邮箱 xxx@1000phone.com:
^\w+@\w+\.\w+$
身份证检测
var reg = /^[1-9]\d{16}([0-9]|X)$/;
中文检测
var reg = /[\u4e00-\u9fa5]/;
字符串首尾去空格
var str = ' abc ';
// 去空格其实就是 - 字符串替换
//去首
//var reg = /^\s+/;
//str = str.replace(reg,'');
//console.log(str);
//去尾
// var reg1 = /\s+$/g;
// str = str.replace(reg1,'');
// console.log(str);
//混合写法
var reg2 = /^\s+|\s+$/g;
str = str.replace(reg2,'-');
console.log(str);
文件格式检测
// 文件格式检测 以 (jpg|jpeg|bmp)结尾。
var reg = /\.(jpg|jpeg|bmp)$/
var str = '23.jpg'
var arr = reg.test(str);
console.log(arr)
函数封装的方法
//校验是否全由数字组成
function isDigit(s)
{
var patrn=/^[0-9]{1,20}$/;
if (!patrn.exec(s)) return false
return true
}
//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
function isRegisterUserName(s)
{
var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;
if (!patrn.exec(s)) return false
return true
}
//校验用户姓名:只能输入1-30个以字母开头的字串
function isTrueName(s)
{
var patrn=/^[a-zA-Z]{1,30}$/;
if (!patrn.exec(s)) return false
return true
}
//校验密码:只能输入6-20个字母、数字、下划线
function isPasswd(s)
{
var patrn=/^(\w){6,20}$/;
if (!patrn.exec(s)) return false
return true
}
//校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
function isTel(s)
{
//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/;
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
if (!patrn.exec(s)) return false
return true
}
//校验手机号码:必须以数字开头,除数字外,可含有“-”
function isMobil(s)
{
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
if (!patrn.exec(s)) return false
return true
}
//校验邮政编码
function isPostalCode(s)
{
//var patrn=/^[a-zA-Z0-9]{3,12}$/;
var patrn=/^[a-zA-Z0-9 ]{3,12}$/;
if (!patrn.exec(s)) return false
return true
}
//校验搜索关键字
function isSearch(s)
{
var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;'\,.<>/?]{1}[^`~!@$%^&()+=|\\\][\]\{\}:;'\,.<>?]{0,19}$/;
if (!patrn.exec(s)) return false
return true
}
function isIP(s) //by zergling
{
var patrn=/^[0-9.]{1,20}$/;
if (!patrn.exec(s)) return false
return true
}