什么是正则表达式呢?
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等。
先科普一下基本的知识
js中使用正则表达式,除了了解正则表达式基本的匹配规则外。还需要了解下面的基本的知识:
python,js,groovy这些脚本语言都有在线调试的网站,可以在线测试是否有语法错误,用起来也很方便。
var reg = new RegExp('\\d{8-20}')
reg.test(“11111111a”)
这里的\\,第一个\是转义符,用于转义。
上面的例子还可以写成:
var reg = new RegExp(/\d{8-20}/)
reg.test(“11111111a”)
test可以测试字符串是否匹配正则表达是的规则,exec、match用于捕获匹配的子串。
说白了正则表达式就是处理字符串的,我们可以用它来处理一些复杂的字符串。
为什么要学习正则表达式我们直接用一个例子来说明
//找出这个字符串中的所有数字 var str = 'abc123de45fgh6789qqq111'; //方法1 function findNum(str) { var tmp = '', arr = []; for (var i = 0; i < str.length; i++) { var cur = str[i]; if (!isNaN(cur)) { tmp += cur; } else { if (tmp) { arr.push(tmp); tmp = ''; } } } if (tmp) { arr.push(tmp) } return arr; } console.log(findNum(str)) //["123", "45", "6789", "111"] //方法2 使用正则表达式 var reg = /\d+/g; console.log(str.match(reg)) // ["123", "45", "6789", "111"]
通过比较2种方法我们明显看出在对字符串进行处理时,使用正则表达式会简单许多,所以虽然正则表达式看起来像是火星文一样的一堆乱码的东西,但我们还是有必要去学习它的。
正则表达式的创建方式
1、字面量创建方式
2、实例创建方式
var reg = /pattern/flags // 字面量创建方式 var reg = new RegExp(pattern,flags); //实例创建方式 pattern:正则表达式 flags:标识(修饰符) 标识主要包括: 1. i 忽略大小写匹配 2. m 多行匹配,即在到达一行文本末尾时还会继续寻常下一行中是否与正则匹配的项 3. g 全局匹配 模式应用于所有字符串,而非在找到第一个匹配项时停止
字面量创建方式和构造函数创建方式的区别
字面量创建方式不能进行字符串拼接,实例创建方式可以
var regParam = 'cm'; var reg1 = new RegExp(regParam+'1'); var reg2 = /regParam/; console.log(reg1); // /cm1/ console.log(reg2); // /regParam/
字面量创建方式特殊含义的字符不需要转义,实例创建方式需要转义
var reg1 = new RegExp('\d'); // /d/ var reg2 = new RegExp('\\d') // /\d/ var reg3 = /\d/; // /\d/
元字符
代表特殊含义的元字符
\d : 0-9之间的任意一个数字 \d只占一个位置
\w : 数字,字母 ,下划线 0-9 a-z A-Z _
\s : 空格或者空白等
\D : 除了\d
\W : 除了\w
\S : 除了\s
. : 除了\n之外的任意一个字符
\ : 转义字符
| : 或者
() : 分组
\n : 匹配换行符
\b : 匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数
^ : 限定开始位置 => 本身不占位置
$ : 限定结束位置 => 本身不占位置
[a-z] : 任意字母 []中的表示任意一个都可以
[^a-z] : 非字母 []中^代表除了
[abc] : abc三个字母中的任何一个 [^abc]除了这三个字母中的任何一个字符
代表次数的量词元字符
* : 0到多个
+ : 1到多个
? : 0次或1次 可有可无
{n} : 正好n次;
{n,} : n到多次
{n,m} : n次到m次
量词出现在元字符后面 如\d+,限定出现在前面的元字符的次数
var str = '1223334444'; var reg = /\d{2}/g; var res = str.match(reg); console.log(res) //["12", "23", "33", "44", "44"] var str =' 我是空格君 '; var reg = /^\s+|\s+$/g; //匹配开头结尾空格 var res = str.replace(reg,''); console.log('('+res+')') //(我是空格君)
正则中的()和[]和重复子项 //拿出来单独说一下
一般[]中的字符没有特殊含义 如+就表示+
但是像\w这样的还是有特殊含义的
var str1 = 'abc'; var str2 = 'dbc'; var str3 = '.bc'; var reg = /[ab.]bc/; //此时的.就表示. reg.test(str1) //true reg.test(str2) //false reg.test(str3) //true
[]中,不会出现两位数
[12]表示1或者2 不过[0-9]这样的表示0到9 [a-z]表示a到z 例如:匹配从18到65年龄段所有的人 var reg = /[18-65]/; // 这样写对么 reg.test('50') reg = /(18|19)|([2-5]\d)|(6[0-5])/;
Uncaught SyntaxError: Invalid regular expression: /[18-65]/: Range out of order in character class 聪明的你想可能是8-6这里不对,于是改成[16-85]似乎可以匹配16到85的年龄段的,但实际上发现这也是不靠谱的实际上我们匹配这个18-65年龄段的正则我们要拆开来匹配我们拆成3部分来匹配 18-19 20-59 60-65
()的提高优先级功能:凡是有|出现的时候,我们一定要注意是否有必要加上()来提高优先级;
()的分组 重复子项 (两个放到一起说)
分组:
只要正则中出现了小括号那么就会形成一份分组
只要有分组,exec(match)和replace中的结果就会发生改变(后边的正则方法中再说)