什么是正则表达式?
-
正则表达式是由一个字符序列形成的搜索模式
-
当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容
-
正则表达式可以是一个简单的字符,或一个更复杂的模式
-
正则表达式可用于所有文本搜索和文本替换的操作
正则表达式的特点
- 灵活性、逻辑性和功能性非常的强
- 可以迅速地用极简单的方式达到字符串的复杂控制
- 对于刚接触的人来说,比较晦涩难懂
- 实际开发,一般都是直接复制写好的正则表达式. 但是要求会使用正则表达式并且根据实际情况修改正则表达式
字符
字符 | 等价类 | 含义 |
---|---|---|
. | [^\n\r] | 除了回车符和换行符之外的所有字符 |
\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] | 非单词字符 |
字符 | 匹配 |
---|---|
{n,m} | 匹配前一项至少n次,但不能超过m次 |
{n,} | 匹配前一项n次或更多次 |
{n} | 匹配前一项n次 |
? | 匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1} |
匹配前一项1次或多次,等价于{1,} | |
* | 匹配前一项0次或多次,等价于{0,} |
元字符/元符号 | 匹配 |
---|---|
$ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
^ | 匹配字符串的开头,在多行检索中,匹配一行的开头 |
\A | 只有匹配字符串开始处 |
\b | 匹配单词边界,词在 []内时无效 |
\B | 匹配非单词边界 |
\G | 匹配当前搜索的开始位置 |
\Z | 匹配字符串结束处或行尾 |
\z | 只匹配字符串结束处 |
修饰符
在正则表达式的第二条斜线之后,可以指定一个或多个修饰符,/pattern/g
。
常用修饰符:
i
执行不区分大小写的匹配。g
全局匹配。m
多行匹配模式。y
“粘连”(sticky)修饰符。y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。s
表示点(.)可以表示任意字符,不设置的话,四个字节的 UTF-16 字符和行终止符不能用 . 表示。u
开启 “Unicode 模式”,用来正确处理大于\uFFFF
的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
正则表达式的创建
在 JavaScript 中,可以通过两种方式创建一个正则表达式。
方式一:通过调用RegExp对象的构造函数创建
<script type="text/javascript">
var E = new RegExp(/123/);
console.log(E); //输出 /123/
</script>
方式二:利用字面量创建 正则表达式
<script type="text/javascript">
var exe = /123/;
console.log(exe)//输出 /123/
</script>
测试正则表达式
test() 正则对象方法,用于检测字符串是否符合该规则,该对象会返回 true 或 false,其参数是测试字符串。
<script type="text/javascript">
var exe = /123/;
console.log(exe.test(123));//匹配字符中是否出现123 出现结果为true
console.log(exe.test('abc'));//匹配字符中是否出现123 未出现结果为false
console.log(exe.test('123abc'));匹配字符中是否出现123 出现结果为true
</script>
正则方法
split()
用于把一个字符串分割成字符串数组。传递一个正则表达式作为参数,使这个方法根据正则表达式进行拆分.不使用全局匹配依然全部拆分
<script type="text/javascript">
var str = "1a2b3c4d5e6f7g"
var ret = str.split(/[a-z]/)
console.log(ret)
</script>
replace()
用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
参数1:被替换的内容
参数2:新内容
注意:如果不进行全局匹配只替换第一个
<script type="text/javascript">
var str = "1a2b3c4d5e6f7g"
var result = str.replace(/b|e/g,",")
console.log(result)
</script>
search()
方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
<script type="text/javascript">
var str = "1a2b3c4d5e6f7g"
var ret1 = str.search(/[6-9]/)
console.log(ret1)
</script>
边界符
正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符
边界符 | 说明 |
---|---|
^ | 表示匹配行首的文本(以谁开始) |
$ | 表示匹配行尾的文本(以谁结束) |
如果 ^和 $ 在一起,那么必须是精确匹配
<script type="text/javascript">
var R = /abc/;
// /abc/ 只要包含有abc这个字符串返回的都是true
console.log(R.test('abc'));
console.log(R.test('abcd'));
console.log(R.test('aabcd'));
</script>
<script type="text/javascript">
var R = /^abc/; //^必须是以a开头
console.log(R.test('abc')); // true
console.log(R.test('abcd')); // true
console.log(R.test('cbcd')); // false
</script>
<script type="text/javascript">
var reg1 = /^abc$/;
// 精确匹配 必须是 abc字符串才可以
console.log(reg1.test('abc')); // true
console.log(reg1.test('abcd')); // false
console.log(reg1.test('abcde')); // false
console.log(reg1.test('abcdef')); // false
</script>
[] 方括号
**表示有一系列字符可供选择,只要匹配其中一个就可以了** 只要字符中有匹配方括号其中的一个,就返回 true
方括号内部加上 ^ 表示取反,只要包含方括号内的字符,都返回 false 。区别于边界符 ^ ,必须在方括号内部才是取反
<script type="text/javascript">
var R = /[abc]/;
// 只要包含有a 或者 b 或者 c 都返回为true
console.log(R.test('meta'));//true
console.log(R.test('body'));//true
console.log(R.test('head'));//true
console.log(R.test('html'));//false
</script>
<script type="text/javascript">
var R = /^[abc]$/;
// 三选一 只有是a 或者 b 或者c 这三个字母返回 true
console.log(R.test('a'));//true
console.log(R.test('b'));//true
console.log(R.test('c'));//true
console.log(R.test('d'));//false
console.log(R.test('e'));//false
</script>
<script type="text/javascript">
var R = /^[a-z]$/
//26个英文字母任何一个字母返回 true 表示是a到z的范围 (小写字母)
console.log(R.test('a'));//true
console.log(R.test('b'));//true
console.log(R.test('y'));//true
console.log(R.test('W'));//false
console.log(R.test('D'));//false
</script>
<script type="text/javascript">
// 26个英文字母(大写和小写都可以)任何一个字母返回 true
//0-9数字也可,但必须是单个
var R = /^[a-zA-Z0-9]$/;
console.log(R.test('a'))//true
console.log(R.test('A'))//true
console.log(R.test(0))//true
console.log(R.test('aa'))//false
console.log(R.test('AA'))//false
console.log(R.test(99))//false
</script>
<script type="text/javascript">
// 只要不是26个英文字母任何一个字母返回 true
//数字也返回false
var R = /^[^a-zA-Z0-9]$/;
console.log(R.test('aa'))//false
console.log(R.test('bb'))//false
console.log(R.test('!'))//true
console.log(R.test(' '))//true
console.log(R.test('888'))//false
</script>