正则总结:
概念:
-
ide查找/替换,js中使用
-
按照规则匹配符合条件的字符串
find ./ -name *.txt
- 图形工具:
修饰符
- g/i/m 修饰符:全局搜索,忽略大小写,多行搜索
元字符
-
原义文本字符
-
元字符
有特殊含义的非字母字符
* + ? $ ^ . | \ () {} []字符 含义 /t 水平制表符 /v 垂直制表符 /n 换行符 /r 回车符 /0 空字符 /f 换页符 /cX 与X对应的控制字符(ctrl+X)
[ ] 归类,
有其中 一个就行
^ 反向类/负向类,不属于某类
[^abc] 表示不属于a或b或c的内容
范围类
-
[a-z] 闭区间,a到z
[a-zA-Z]
[0-9-] 包括横线
'2016-12-12'.replace(/[0-9-]/g,'a')
'aaaaaaaaaa'
预定义类
| 字符 | 等价类 | 含义 |
|---|---|---|
| . | [^\r\n] | 除了回车符和换行符之外的所有字符 |
| \d | [0-9] | 数字字符 |
| \D | [^0-9] | 非数字字符 |
| \s | [\t\n\x0B\f\r] | 空白符 |
| \S | [^\t\n\x0B\f\r] | 非空白符 |
| \w | [a-zA-Z_0-9] | 单词字符(字母、数字下划线) |
| \W | [^a-zA-Z_0-9] | 非单词字符 |
边界
| 字符 | 含义 |
|---|---|
| ^ | 以xxx开始(不是在中括号里面就不是取反了) |
| $ | 以xxx结束 |
| \b | 单词边界 |
| \B | 非单词边界 |
- m修饰符的应用:
const aa =
“@123
@456
@789
“
aa.replace(/^@\d/gm,'x')
“x123
x456
x789
“
量词
| 字符 | 含义 |
|---|---|
| ? | 出现零次或一次(最多出现一次) |
| + | 出现一次或多次(至少出现一次) |
| * | 出现零次或多次(任意次) |
| {n} | 出现n次 |
| {n,m} | 出现n到m次 |
| {n,} | 至少出现n次 |
-
贪婪模式(默认)
\d{3,6} 1234567 // 尽可能多的匹配
// 把前面123456个都匹配了
2. 非贪婪模式,尽可能少的匹配
在量词后加?即可
```js
\d{3,6}?
1234567
// 尽可能少的匹配
// 把123,456匹配了
分组
-
加()即可
就是整个匹配
'a1b2c3d4'.replace(/([a-z]\d){3}/g,'x')
'xd4'
或 |
- 注意第二例子结合了分组
'ByronCasper'.replace(/Byron|Casper/g,'x')
'xx'
'ByronsperByrCasper'.replace(/Byr(on|Ca)sper/g,'x')
'xx'
反向引用
- 用2...引用分组
'2016-11-25'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1')
'11/25/2016'
分组捕获
-
忽略分组
不希望捕获某个分组,就在该分组内加 ?: 即可
(?:byron).(ok)
前瞻
-
正则从头像尾解析,文本尾部称为前
前瞻即向前检查是否符合断言
js不支持后顾
- 符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配
| 名称 | 正则 | 含义 |
|---|---|---|
| 正向前瞻 | exp(?=assert) | |
| 负向前瞻 | exp(?!assert) | |
| 正向后顾 | exp(?<=assert) | js不支持 |
| 负向后顾 | exp(?<!assert) | js不支持 |
'a2*34vv'.replace(/\w(?=\d)/g,'x')
'x2*x4vv'
'a2*34vv'.replace(/\w(?!\d)/g,'x')
'ax*3xxx'
正则对象的属性
-
global:全局搜索,默认false
-
ignoreCase:大小写敏感,默认false
-
multiline:多行搜索,默认false
-
lastIndex:当前表达式匹配内容最后一个字符的下一个位置
-
source:正则文本字符串
正则表达式本身的方法:
-
test(str)方法
用于测试字符串参数中是否存在匹配正则表达式模式的字符串,存在返回true,不存在返回false
注意g修饰符的区别
var reg1 = /\w/; var reg2 = /\w/g; while(reg2.test('ab')){ console.log(reg2.lastIndex) } // 1 // 2 -
exec(str)方法
使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果
如果没有匹配的文本则返回null,否则返回一个结果数组
-
index声明匹配文本的第一个字符的位置
-
input 存放被检索的字符串string
-
调用非全局的RegExp对象的exec()时,返回结果数组
第一个元素是与正则相匹配的文本
第二个是第一个子表达式相匹配的文本
以此类推
全局调用注意g标志
var reg = /\d(\w)(\w)\d/; var ts = '$1az2bb3cy4dd5ee' var ret = reg.exec(ts) console.log(reg.lastIndex + '\t' + ret.index + '\t' + ret.toString()); console.log(reg.lastIndex + '\t' + ret.index + '\t' + ret.toString()); // "0 1 1az2,a,z" var reg1 = /\d(\w)(\w)\d/g; while(ret = reg1.exec(ts)){ console.log(reg1.lastIndex + '\t' + ret.index + '\t' + ret.toString()); } // "5 1 1az2,a,z" // "11 7 3cy4,c,y" -
字符串的方法
-
search(str/reg)方法
- 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
- 返回第一个结果的index,找不到返回-1
- 不执行全局匹配,忽略g,总是从开头进行检索
-
match() 方法
-
检索字符串,找到一个或多个与regexp匹配的文本
regexp是否有g,有很大影响
-
非全局调用
-
只匹配一次
-
没找到任何文本,返回null
-
否则将返回一个数组
-
第一个元素是匹配的文本,其余是子表达式匹配的文本
-
包含两个对象属性
-
index声明匹配字符串在字符串的位置
-
input声明对stringObject的引用
非全局调用与exec相同
-
-
-
-
全局调用时
- 只返回结果。没有分组信息,index,lastIndex等
-
-
split()方法
参数也可以是正则
-
replace()
-
第一参数找谁,第二个参数是替换成谁
str.replace(str,replaceStr) str.replace(reg,replaceStr) str.replace(reg,function) -
function 参数
- 匹配字符串
- 分组内容,没有则无此参数
- 匹配项在字符串中的index
- 原字符串
-