js正则表达式----RegExp, 代码说明简单易懂

RegExp正则表达式定义RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。匹配原则: 贪婪匹配
直接量语法

RegExp

正则表达式定义

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。匹配原则: 贪婪匹配
直接量语法
/pattern(匹配规则)/attributes(属性)
创建 RegExp 对象的语法:
new RegExp(pattern(规则), attributes(属性, 修饰符));

1
2
3
var reg = /abc/m;
var reg1 = new RegExp("abc", "m");
var reg2 = new RegExp(reg);//这里的参数也可以直接写创建好的正则表达式

使用正则表达式分两种:
字符串中的方法和正则中的方法.

  1. reg.test(str);返回结果true和false
  2. str.match(reg);返回匹配的结果

正则表达式属性

即(属性可以并列)

1
2
3
var reg1 = /abc/i;
var reg2 = /abc/m;
var reg3 = /abc/g;
修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

正则表达式规则(方括号)

我们来以代码阐述问题

1
2
var reg = /[1234567890][1234567890][1234567890]/g;
var str = "as123ascadfsdfgfdgf";

上述代码中的正则表达式代表我们要匹配3个值的字符串, 每个值分别为3个方括号里的值中的一个, 即0-9. 在下文的学习中我们更简单的方法例如将[0123456789]改成[0-9]也是可以的.

方法汇总:

表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。(注意在方括号和不在方括号时^的区别)
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red\ blue\ green) 查找任何指定的选项。(匹配一个字符, 即匹配red或blue或green)

正则表达式元字符

元字符是拥有特殊含义的字符, 在表达式中也可以选择元字符.

例如:

1
2
\w === [0-9A-z_];
\W === [^\w];

用法:

1
2
var reg = /\wcd2/;
var str = "acd2";

元字符汇总

元字符 描述
. 查找单个字符,除了换行和行结束符。=== [^\r\n]
\w 查找单词字符。
\W 查找非单词字符。
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符。(包括空格符, 制表符, 回车符, 换行符, 垂直换行符, 换页符, 即\s === [\t\n\r\v\f空格])
\S 查找非空白字符。
\b 匹配单词边界。例如:var str = “abc cde fgh”, 这就是6个单词边界. 用法: var reg = /\bc/g;, 即表达匹配在单词边界的c
\B 匹配非单词边界。
\0 查找 NUL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

正则表达式量词

用法:

1
2
var reg = /\w+/g;
var str = "abc";

注意:

1
2
var reg = /\w*/g;
var str = "abc";

如果调用str.match(reg);会返回给我们两个匹配结果, 第一个字符串为abc, 第二个为空字符串, 即”中间没空格”. 因为n*可以匹配空

我们在看一个例子:

1
2
var reg = /\d*/g;
var str = "abc";

结果为:
这里写图片描述

原因: 匹配4次光标

量词汇总:

量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 至 Y 个 n 的序列的字符串。
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

来一道例题:
检测一个字符串收尾是否含有数字

1
var reg = /^\d|\d$/g;

若是想要检测收尾都含有数字

1
var reg = /^\d[\s\S]*\d$/g;

RegExp 对象属性

属性 描述
global RegExp 对象是否具有标志 g。
ignoreCase RegExp 对象是否具有标志 i。
lastIndex 一个整数,标示开始下一次匹配的字符位置。
multiline RegExp 对象是否具有标志 m。
source 正则表达式的内容。

RegExp 对象方法

方法 描述
compile 编译正则表达式。
exec 检索字符串中指定的值。返回找到的值,并确定其位置。位置在exec返回之中的index属性中(需要用console.log()打印出来), 控制台直接输出看不到index属性 , 每一次匹配结束的位置就是lastindex属性开始的位置
test 检索字符串中指定的值。返回 true 或 false。

支持正则表达式的 String 对象的方法

方法 描述
search 检索与正则表达式相匹配的值。
match 找到一个或多个正则表达式的匹配。
replace 替换与正则表达式匹配的子串。
split 把字符串分割为字符串数组。

replace用法:

1
2
3
4
5
var str1 = "abcdasedf";
var str2 = "abcdasedf";
var reg = /a/g;
str1.replace("a", "b");
str2.replace(reg, "b");

str1中第一个a替换成b
str2中所有a替换都成b


知识点小例题

一.

1
2
3
var str = "aaaa";
var reg = /(a)\1\1\1/g;
var reg1 = /(\w)\1(\w)\2/g;

上述代码中\1会引用( )中的内容, 当然括号中的内容也可以换成\w, \2会引用第二个( )中的内容, 在exec方法中, 若是调用console.log( )方法还会把\1\2的内容给输出出来.


二.

1
2
3
var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
console.log(str.replace(reg, "$2$2$1$1"));

\$1, \$2分别引用的是匹配到的第一个括号内的值和第二个值

1
2
3
console.log(str.replace(reg, function($, $1, $2) {
return $2 + $2 + $1 + $1;
}))

当然也可以采用函数作为第二参数


三.
例: 将the-first-name变成theFirstName

1
2
3
4
5
var reg = /-(\w)/g;
var str = "the-first-name";
console.log(str.replace(reg, function($, $1) {
return $1.toUpperCase();
})

四.

1
2
3
var str = "abaaaa";
var reg1 = /a(?=b)/g;
var reg2 = /a(?!b)/g;

第一个只会返回1个a


五.
‘?’会取消贪婪匹配

1
2
var str = "aaaaaa";
var reg = /a?/g;

返回只有一个a


六.
字符串去重

1
2
3
var str = "aaaabbbbcccc";
var reg = /(\w)\1*/g;
console.log(str.replace(reg, "$1"));

七.
最后一道例题我们来一道最坑爹的2012年百度笔试题
例: 给你一个类似于1000000这样的一个数字, 把它转化成科学计数的形式, 即1,000,000

1
2
3
var str = "1000000";
var reg = /(?=(\B)(\d{3})+$)/g;
str.replace(reg, ".");

从后往前查, 找到3个数(一到多个), 是不是后面为3个数的占空位并且以这个结尾(非单词边界)


八.
字符串中还有两个方法为, toUpperCase( )和toLowerCase( )变换大小写

越来越多的平台(微信公众平台,新浪微博,简书,百度打赏等)支持打赏功能,付费阅读时代越来越近,特此增加了打赏功能,支持微信打赏和支付宝打赏。坚持原创技术分享,您的支持将鼓励我继续创作!