什么是正则表达式
- 正则表达式是一个强大的字符串处理工具
正则的用途
- 进行特定的字符和字符串的搜索
- 替换字符串中特定的字符或字符串
- 验证字符串是否符合需求
<script>
var str="qw123jl43llfa789dg498lfds";
let re=/\d+/g
// \d表示查找字符类型为数字,+表示量词为一次以上,g表示全局查找
alert(str.match(re));
</script>
正则的写法
- 字面量 let re1 = /\d+/g 类似于数组,优点简单方便
- 构造函数 let re2 =new RegExp('正则表达式','gim')。 类似于数组,优点支持变量
正则表达式元字符(正则表达式中有特殊含义的字符)
元字符
. | 匹配除了换行和特殊空白符之外的字符 |
\w | 匹配数字、字母、下划线。 |
\W | 匹配除数字、字母、下划线。 |
\d | 匹配数字 |
\D | 匹配数字以外的字符 |
\s | 匹配空白字符 |
\S | 匹配空白字符之外的字符 |
\b | 匹配单词边界 / \bis/g is单词,而不是is字母 |
\B | 匹配非单词边界 |
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配制表符 |
g | 全局匹配 |
i | 不区分大小写 |
m | 多行匹配,就是字符串的换行符直接识别为换行,而不是换行符。相当于新的开始 |
量词
+ | 至少匹配一次,最多不限 |
? | 匹配0到1次 |
* | 至少匹配0次,最多不限 |
{ n} | 匹配n次 |
{n,} | 至少匹配n次,最多不限 |
{n,m} | 最少匹配n次,最多匹配m次 |
只能影响前面的一个字符或者一个小括号的内容
贪婪模式(默认模式):{3,8}会按照8来查找,就是按照最多的来查找;
非贪婪模式(在量词后面加问号):{3,8}?的形式。这样他就会按照最少的次数匹配。当前是3.
范围匹配
[asdf] | 匹配asdf这四个字符中的任意一个字符 |
[0-9] | 匹配0到9的任意一个数字 |
[a-z] | 匹配任意一个小写字母 |
[A-Z] | 匹配任意一个大写字母 |
[A-z] | 匹配所有字母中的任意一个 |
[\u4e00-\u9fa5] | 匹配汉字 |
[0-9-] | 匹配横线在范围类之后加 |
<script>
var str="safsdgfasffafadadsgfhafsgd";
// 匹配单个字符串
let re1=/afs/g
// 匹配以a开头的三个字符
let re2=/a[A-z]{2}/g
// []表示匹配标准为全体字母
alert(str.match(re2));
</script>
分组
分组是正则中非常常见且重要的概念
- 使用()对正则表达式进行分组,每个()为一个子组。
- 每个子组都是一个子正则表达式
- 通过分组,可以改变量词的影响范围。 /[a-z]\d+/与/([a-z]\d)+/结果完全不同
量词默认只影响前面一个字符或一个小括号内的内容。
['f1f2f23'] //第一是一个字母加一个数字,第二个是一个字母加数字,第三个是一个字母加多个数字
let re = /([a-z]\d){2,}[a-z]/;
分组会自动捕获。如。'2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2$3$1');则变成:12252015。$1=2015(第一个分组),$2=12(第二个分组),$3=25(第三个分组)。
忽略分组:即用到分组,但又不想捕获分组。在分组内加?: 如'2015-12-25'.replace(/(?:\d{4})-(\d{2})-(\d{2})/g。怎$1=12(第二个分组括号)
前瞻
前瞻就是找到当前目标字符串后再匹配他的儿子是否符合要求。
- 正向前瞻:exp(?=assert)。如/ \w(?=\d)/ \w是要匹配的目标字符串,(?=\d)他后面的需要是数字。
- 负向前瞻:exp(?!assert)。如/ \w(?=\d)/ \w是要匹配的目标字符串,(?!\d)他后面的不是数字。
位置限制
- 开始位置 let re=/^\d/
- 结束位置 let re=/\d$/
对象属性
var reg1=/\w/;
var reg2=/\w/g;
- global:是否全文检索,默认false 如\g
- ignore case:是否大小写敏感,默认false 如\i
- multiline:多行搜索,默认false 如\m
- lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置。下一次搜索的开始位置。reg2.lastIndex会存在执行反复,他的test()方法会存在false的情况。因为他在lastIndex的值是变动的,执行到最后的字符后则会重置。非全局不生效。
- index:开始匹配文本的初始位置
- source:正则表达式的文本字符串
字符串的匹配方法
- search(正则表达式或者字符串):检查字符串是否有目标字符串,有则返回第一个匹配结果的index,没有返回-1.不支持\g,都是从字符串开始检索。
- match:没有\g标记时,只对字符串做一次匹配,没找到返回null。有的话就返回一个相关信息的数组,其中有index和子表达式的文本。如果有\g则是返回匹配的结果数组,没有lastIndex了。
- split():字符串转换数组。'a,b,c,d'.split(/\d/g)=["a","b","c","d"]
- replace('查找的字符串',"替换成的字符串");替换成的字符串也可以是一个有返回值的函数。