1、JS正则表达式简介正则表达式
一、正则表达式: Regular Expression 使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。数组
二、正则表达式在线工具: regexper.com函数
本地安装工具
三、例子用符: \b is \b ----------- 单词 is ,\b是 word boundary,单词边界测试
. --------- 任意字符; \. -------- . ; \ / --------- / ; ( **** ) ---------- 分组;spa
\d --------- 数字 ; \d{4} ----------- 4个数字 ; [/-] -------- []是或者, / 或者-;prototype
^-----------开头 ; $ ---------- 结尾;regexp
$1 --------- ; $2----------- ; $3------------ 对象
2、认识正则表达式ip
一、RegExp对象
JS经过内置对象RegExp支持正则表达式;
两种方法实例化RegExp对象: 字面量 和 构造函数
字面量: var reg = / \bis\b/g;
构造函数:var reg = new RegExp('\\bis\\b','g');
例子用符: / *** /g ----------- g是全局搜索,不加就匹配第一个
i ----------- ignore case ,忽略大小写,默认大小写敏感
m --------- multiple lines 多行搜索
二、元字符
正则表达式由两种基本字符类型字符:
原以文本字符
元字符 ---------------- 在正则表示式中有特殊含义的非文本字符
. * + ? $ ^ | \ () {} []
\t------ 水平制表符 \n --------- 换行 \r ---------- 回车
三、字符类
通常状况下正则表达式一个字符对应字符串一个字符。
咱们可使用元字符 [] 来构建一个简单的类;所谓类是指符合某些特性的对象,一个泛指,而不是特指某个字符;如 表达式 [abc] 把字符 a 或 b 或 c归为一类,表达式能够匹配这类的字符。
字符类取反 : 使用元字符^建立 反响类/负向类。 [^abc]
四、范围类
正则表达式还提供了范围类;因此咱们可使用 [a-z]来链接两个字符表示 从a到z的任意字符,这是闭区间,包含a和z自己。
在 [] 组成的类内部是能够连写的 [a-zA-Z0-9];
- 的匹配正经常使用:[0-9-] -------- 匹配0~9或-;
五、JS预约义类及边界
预约义类: . ----------------- 除回车和换行以外的全部字符
\d ------- [0-9] ----------- 数字字符
\D ---------- [^0-9] ----------- 非数字字符
\s --------- [\t\n\r\f] ----------- 空白符
\S ----------- [^\t\n\r\f] ---------- 非空白符
\w ----------[a-zA-Z_0-9] ---------- 单词字符(数字、字母或下划线)
\W -------- [^a-zA-Z_0-9] ---------- 非单词字符
边界匹配字符:
^ ------------- 以 xxx 开始
$ ------------ 以 xxx 结束
\b ----------- 单词边界
\B ----------- 非单词边界,如 'This is a boy'.replace(/\Bis\b/g,0);
六、量词
? -------- 出现0次或一次( 最多1次)
+ -------- 出现1次或屡次 (最少1次)
* --------- 出现任意次
{n} -------- 出现n次
{n,m} --------- 出现 n到m次
{n,} -------- 至少出现n次
{0,n} -------- 最多n次
七、贪婪模式与非贪婪模式
贪婪模式: \d{n,m} --------------- 尽量多的匹配,m次
非贪婪模式: \d{n,m} ------------- 能匹配到n次就能够了,在量词后面加?
如: ‘123456789’.match(/\d{3,5}?/g)
八、分组
Bayron{3} = Bayro + 'n{3}' -------------- 是匹配的最后一个字母,不是单词,匹配单词须要分组
使用()进行分组 : (Bayron){3}
或 :使用 | 达到或的效果 --------- abc(d|e)123 : 匹配 abcd123 或abce123
反响引用:$1$2$3 ---------- 捕获分组,对单个无效
如 2015-12-26 改成 12/26/2015 : ‘2015-12-26’.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1');
忽略分组: 不但愿捕获某些分组,只须要在分组内加上?:就能够了:
(?:Bayron).(ok)
九、前瞻
正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”。
前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言[便是否符合附加条件];
后顾/后瞻方向相反,Javascript不支持后顾
符合和不符合特定断言称为 确定/正向 匹配 和 否认/负向 匹配
正向前瞻 -------- exp(?=assert)
负向前瞻 -------- exp(?!assert)
例子: ‘a2*3’.replace(/\w(?=\d)/g,'X'); ----- 'X2*3' 意思是匹配的字符后面要是数字就替换
十、JS对象属性
global: 全文搜索,默认false
ignore case: 是否忽略大小写敏感,默认false
multiline: 多行搜索,默认false
lastIndex: 是当前表达式匹配内容的最后一个字符的下一个位置
source:正则表达式的文本字符串
十一、test和exec方法
RegExp.prototype.test(str): 用于测试字符串参数中是否存在匹配正则表达式模式的字符串,返回 true 或 false。
注: test()的结果受lastIndex的影响,为false的重置。
RegExp.prototype.exec(str):使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果。返回 null 或 数组。数组属性:
------- index 声明匹配文本的第一个字符的位置
------ input 存放被检索的字符串 string
十二、字符串对象方法
String.prototype.search(reg)
search():用于检测字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
方法返回第一个匹配结果index,查找不到返回-1。
search()方法不执行全局匹配,它将忽略标志 g ,而且老是从字符串的开始进行搜索。
String.prototype.match(reg)
match()方法将检索字符串,以找到一个或多个与regexp匹配的文本;返回 null 或 数组。
regexp是否具备标志 g 对结果影响很大,没有就执行一次。
数组属性仍是 index 和 input[存放正则表达式]
String.prototype.split(reg)
经常使用split()把字符串分割成字符数组,如: ‘a1f2g4g6’.split(/\d/g) ---- ['a','f','g','g'] 以数字分割。
String.prototype.replace(str,replaceStr) ---------- 第一个str但是 /正则表达式/g
String.prototype.replace(str,function) ,function参数的含义:
function会在每次匹配替换的时候调用,有四个参数:
一、匹配字符串
二、正则表达式分组内容,没有分组则没有该参数
三、匹配项在字符串中的index
四、原字符串
例子: 字符串中数字+1
‘a1g2f3h4’.replace(/\d/g,function(match,index,origin){
return parseInt(match)+1;
});