|
1 | | -正则表达式,广泛用在处理和验证字符串上; |
| 1 | +程序员必备的知识; |
2 | 2 |
|
3 | | -在[RegExp类型](../数据类型详解/RegExp类型.md)也笼统总结了; |
| 3 | +最起码要能写出常用替换、匹配的正则;实在不行也要能看懂的; |
| 4 | + |
| 5 | +# RegExp 类型 |
| 6 | + |
| 7 | +主要是以下几个方面 |
| 8 | + |
| 9 | +- 创建 |
| 10 | +- 元字符 |
| 11 | +- 修饰符 |
| 12 | +- 属性 |
| 13 | +- 方法 |
| 14 | + |
| 15 | +# 创建 |
| 16 | + |
| 17 | +有两种方法,字面量和构造函数模式 |
| 18 | + |
| 19 | +- 字面量 |
| 20 | + |
| 21 | + var reg=/\d+/g; |
| 22 | + console.log(reg.test("789456"));//true |
| 23 | + |
| 24 | +- 构造函数 |
| 25 | + |
| 26 | + var reg2=new RegExp("\\d+","g"); |
| 27 | + console.log(reg2.test("1234444456"));//true |
| 28 | + console.log(reg2.test("asdsa"));//false |
| 29 | + |
| 30 | +# 元字符 |
| 31 | + |
| 32 | +- 单个字符数字 |
| 33 | + - . 匹配除换行符以外的任意字符 |
| 34 | + - [a-zA-Z0-p] 与 [^a-zA-Z0-p] 匹配方括号中的任意字符,前面代^是匹配不在方括号中的任意字符; |
| 35 | + - \d 与 \D 匹配数字和匹配非数字; |
| 36 | + - \w 与 \W 匹配字符和匹配非字母 |
| 37 | +- 空白字符 |
| 38 | + - \O 匹配null字符 |
| 39 | + - \b 匹配空格字符 |
| 40 | + - \f 匹配换页符 |
| 41 | + - \n 匹配换行符 |
| 42 | + - \r 匹配回车符 |
| 43 | + - \s 和 \S 匹配空白字符,空格、制表符或换行符。大写的S是匹配非空字符 |
| 44 | + - \t 匹配制表符 |
| 45 | +- 定位符 |
| 46 | + - ^ 行首匹配 |
| 47 | + - $ 行尾匹配 |
| 48 | + - \A 只匹配字符串的开始处 |
| 49 | + - \b \B 匹配单词便捷,词在[]内无效,匹配非单词边界 |
| 50 | + - G 匹配当前搜索的开始位置 |
| 51 | + - \Z \z 匹配字符串结束处或行尾,只匹配字符串结束处 |
| 52 | +- 限定符 |
| 53 | + - x? 匹配0个或一个x |
| 54 | + - x* 匹配0个或者任意多个x |
| 55 | + - x+ 匹配一个或者多个 |
| 56 | + - x{m,n} 匹配m-n个x; |
| 57 | +- 分组 |
| 58 | + - (?:x) 匹配x但不记录匹配结果(匹配不捕获) |
| 59 | + - x(?=y) 当x后面接y时匹配x |
| 60 | + - x(?!y) 当x后不是y时匹配x |
| 61 | +- 引用 |
| 62 | + - \1...\9 $1...$9 返回就割在模式匹配期间找到的,最近保存的部分 |
| 63 | +- 或模式 |
| 64 | + - x|y|z 匹配x或者y或者z |
| 65 | + |
| 66 | +# 修饰符 |
| 67 | +可以记img,这样方便记住; |
| 68 | + |
| 69 | +- i 忽略大小写模式 |
| 70 | +- m 多行匹配 |
| 71 | +- g 全局模式 |
| 72 | + |
| 73 | +# 属性 |
| 74 | + |
| 75 | +- 实例属性 |
| 76 | + - global 布尔值,检测是走设置g标记 |
| 77 | + - ignoreCase 布尔值,检测是否设置i标记 |
| 78 | + - nultiline 布尔值,检测是否设置了m标记 |
| 79 | + - lastIndex 整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。 |
| 80 | + - source 返回正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。 |
| 81 | + |
| 82 | +通过这些属性可以获知一个正则表达式的各方面信息,但却没有多大用处,因为这些信息全都包含在模式声明中 |
| 83 | + |
| 84 | + var pattern1 = /\[bc\]at/i; |
| 85 | + console.log(pattern1.global); //false |
| 86 | + console.log(pattern1.ignoreCase); //true |
| 87 | + console.log(pattern1.multiline); //false |
| 88 | + console.log(pattern1.lastIndex); //0 |
| 89 | + console.log(pattern1.source); //"\[bc\]at" |
| 90 | + var pattern2 = new RegExp("\\[bc\\]at", "i"); |
| 91 | + console.log(pattern2.global); //false |
| 92 | + console.log(pattern2.ignoreCase); //true |
| 93 | + console.log(pattern2.multiline); //false |
| 94 | + console.log(pattern2.lastIndex); //0 |
| 95 | + console.log(pattern2.source); //"\[bc\]at" |
| 96 | + |
| 97 | +尽管第一个模式使用的是字面量,第二个模式使用了 RegExp 构造函数,但它们的source 属性是相同的。可见, source 属性保存的是规范形式的字符串,即字面量形式所用的字符串。 |
| 98 | + |
| 99 | +- 构造函数属性 |
| 100 | + - $_ input 返回最近一次匹配的字符串 |
| 101 | + - $& lastMatch 返回最近一次的匹配项 |
| 102 | + - $+ lastParen 返回最近一次匹配的捕获组 |
| 103 | + - $` leftContext 返回被查找的字符串中从字符串开始位置到最后匹配之前的位置之间的字符 |
| 104 | + - $' rightContext 返回被搜索的字符串中从最后一个匹配位置开始到字符串结尾之间的字符 |
| 105 | + - $* multiline 检测表达式是否采用多行匹配m |
| 106 | + |
| 107 | +# 方法 |
| 108 | + |
| 109 | +- 实例方法 |
| 110 | + - test 在字符串中检测模式匹配,返回true或false |
| 111 | + - exec 该方法是专门为捕获组而设计的 |
| 112 | + - 功能:正则捕获的数据,一个数组; |
| 113 | + - 参数:要应用模式匹配的字符串 |
| 114 | + - 特性: |
| 115 | + - 使用全局标记g;持续查找所有匹配项并返回 |
| 116 | + - 不使用全局标记g;始终返回第一个匹配项信息 |
| 117 | + - 执行的过程 |
| 118 | + - 检测字符串参数,获取正则表达式匹配文本 |
| 119 | + - 找到匹配文本则返回一个数组 |
| 120 | + - 第0个元素:与整个模式匹配的字符串 |
| 121 | + - 其他元素:与捕获组匹配的字符串 |
| 122 | + - 否则返回null |
| 123 | + - 派生属性 |
| 124 | + - index 匹配项在字符串中的位置 |
| 125 | + - input 应用正则表达式的字符串 |
| 126 | + - length 返回数组元素的个数 |
| 127 | + |
| 128 | + var text = "cat, bat, sat, fat"; |
| 129 | + var pattern1 = /.at/; |
| 130 | + var matches = pattern1.exec(text); |
| 131 | + console.log(matches.index); //0 |
| 132 | + console.log(matches[0]); //cat |
| 133 | + console.log(pattern1.lastIndex); //0 |
| 134 | + matches = pattern1.exec(text); |
| 135 | + console.log(matches.index); //0 |
| 136 | + console.log(matches[0]); //cat |
| 137 | + console.log(pattern1.lastIndex); //0 |
| 138 | + |
| 139 | + var pattern2 = /.at/g; |
| 140 | + var matches = pattern2.exec(text); |
| 141 | + console.log(matches.index); //0 |
| 142 | + console.log(matches[0]); //cat |
| 143 | + console.log(pattern2.lastIndex); //3 |
| 144 | + |
| 145 | + matches = pattern2.exec(text); |
| 146 | + console.log(matches.index); //5 |
| 147 | + console.log(matches[0]); //bat |
| 148 | + console.log(pattern2.lastIndex); //8 |
| 149 | + |
| 150 | +第一个模式 pattern1 不是全局模式,因此每次调用 exec() 返回的都是第一个匹配项( "cat" )。而第二个模式 pattern2 是全局模式,因此每次调用 exec() 都会返回字符串中的下一个匹配项,直至搜索到字符串末尾为止。此外,还应该注意模式的 lastIndex 属性的变化情况。在全局匹配模式下, lastIndex 的值在每次调用 exec() 后都会增加,而在非全局模式下则始终保持不变。\ |
| 151 | + |
| 152 | +> IE 的 JavaScript 实现在 lastIndex 属性上存在偏差,即使在非全局模式下,lastIndex 属性每次也会变化。 |
4 | 153 |
|
5 | | -程序员必备的知识; |
6 | 154 |
|
7 | | -最起码要能写出常用替换、匹配的正则; |
| 155 | +- 字符串方法 |
| 156 | + - match 找到一个或者多个正则表达式的匹配 |
| 157 | + - replace 替换与正则表达式匹配的子串 |
| 158 | + - search 检索与正则表达式匹配的值 |
| 159 | + - split 把字符串分割为字符串数组 |
0 commit comments