正则表达式是一个对象,这个对象描述一种字符模式。 JavaScript RegExp 类代表正则表达式,字符串和 RegExp 都定义了方法,在方法中使用正则表达式来执行文本 中强大的模式匹配和搜索替换功能。
一、基本语法
正则表达式可以被 RegExp() 构造函数定义,如下所示:
var pattern = new RegExp(pattern, attributes); or simply var patter = /pattern/attributes; |
参数描述:
• pattern:是一个字符串,指定了正则表达式的模式或其他正则表达式。
• attributes:是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹 配和多行匹配。
二、方括号
方括号 ([]) 用于正则表达式的上下文中时有特殊意义,用来查找一系列字符。
表达 | 描述 |
[...] | 查找方括号之间的任何字符 |
[^...] | 查找任何不在方括号之间的字符 |
[0-9] | 查找任何从 0 至 9 的数字 |
[a-z] | 查找任何小写 a 到小写 z 的字符 |
[A-Z] | 查找任何大写 A 到大写 Z 的字符 |
[a-Z] | 查找任何小写 a 到大写 Z 的字符 |
上面所示的范围为一般情况;还可以使用范围 (0-3) 匹配任何从 0 到 3 的十进制数字,或范围 (b-v) 来匹配 任何从小写 b 到小写 v 的字符。
三、量词
方括号括起来的字符序列或单个字符出现的频率或位置可以用一个特殊的符号来表示。每个特殊字符都有一个特定的含义。+、*、? 和 $ 符号都遵循一个字符序列模式。
表达 | 描述 |
p+ | 匹配任何包含至少一个 p 的字符串 |
p* | 匹配任何包含零个或多个 p 的字符串 |
p? | 匹配任何包含零个或一个 p 的字符串 |
p{N} | 匹配包含 N 个 p 的序列字符串 |
p{2,3} | 匹配包含 2 或 3 个 p 的序列的字符串 |
p{2,} | 匹配包含至少 2 个 p 的序列的字符串 |
p$ | 匹配任何结尾为 p 的字符串 |
^p | 匹配任何开头为p 的字符串 |
[^a-zA-Z] | 匹配任何不包含从 a 到 z 和从 A 到 Z 中任何字符的字符串 |
p.p | 匹配任何以一个 p 开始、其次是任意字符、紧随其后的是另一个 p 的字符串 |
^.{2}$ | 匹配任何包含两个字符的字符串 |
<b>(.*)</b> | 匹配任何封闭在 <b> 和 </b> 内的字符串 |
p(hp)* | 匹配任何包含一个p、紧随其后的零个或多个 hp 序列的字符串 |
四、原义字符
字符 | 描述 |
Alphanumeric | 它自己 |
\0 | 查找 NUL 字符(\u0000) |
\t | 查找制表符(\u0009) |
\n | 查找换行符(\u000A) |
\v | 查找垂直制表符(\u000B) |
\f | 查找换页符(\u000C) |
\r | 查找回车符(\u000D) |
\xnn | 指定的以十六进制数 nn 表示的拉丁字符;例如 \x0A 和 \n 表示的一样 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符,例如 \u0009 和 \t 表示的一样 |
\cX | 控制字符^X;例如 \cJ 相当于换行符 \n |
五、元字符
元字符:在一个字母字符之前加上一个反斜杠,使这个组合具有特殊的含义。
例如,您可以使用 '\d' 元字符搜索大量资金数额:/([\d]+)000/,这里 \d 将寻找任何数值字符的字符串。 下面是元字符的列表,使用 PERL 风格的正则表达式表达。
字符 | 描述 |
. | 单个字符 |
\s | 空白字符(空格、制表符、换行符) |
\S | 非空白字符 |
\d | 数字字符(0-9) |
\D | 非数字字符 |
\w | 单词字符(a-z,A-Z,0-9,_) |
\W | 非单词字符 |
[\b] | 一个文字退格(特殊情况) |
[aeiou] | 匹配一个在给定集合内的字符 |
[^aeiou] | 匹配一个不在给定集合内的字符 |
[foo|bar|baz] | 匹配任何指定的备选方案 |
\t | 查找制表符(\u0009) |
六、修饰
几个可用的regexp 修饰符,它能使你的工作更容易,比如大小写敏感、搜索多个行等。
字符 | 描述 |
i | 执行对大小写不敏感的匹配 |
m | 执行多行匹配 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) |
七、RegExp属性
这是 RegExp 的各个属性及对应的属性描述的列表。
属性 | 描述 |
constructor | 指定创建一个对象原型的函数 |
global | RegExp 对象是否具有标志 g |
ignoreCase | RegExp 对象是否具有标志 i |
lastIndex | 一个整数,标示开始下一次匹配的字符位置 |
multiline | RegExp 对象是否具有标志 m |
source | 正则表达式的源文本 |
八、RegExp方法
这是 RegExp 的各个方法及对应的属性描述的列表。
方法 | 描述 |
exec() | 检索字符串中指定的值。返回找到的值,并确定其位置 |
test() | 检索字符串中指定的值。返回 ture 或 false |
toSource() | 返回一个对象字面值代表指定的对象;您可以使用这个值来创建一个新的对象 |
toString() | 返回一个代表指定对象的字符串 |
九、正则表达式的常用例子
1、正则表达式的简单写法
<script type="text/javascript"> //创建正则表达式的对象 /* * 语法: * var 变量 = new RegExp("正则表达式","匹配模式"); * 使用typeof检查正则对象,会返回object * var reg = new RegExp("a"); 这个正则表达式可以来检查一个字符串中是否含有a * 在构造函数中可以传递一个匹配模式作为第二个参数, * 可以是 * i 忽略大小写 * g 全局匹配模式 */ var reg = new RegExp("ab","i"); var str = "Ab"; /* * 正则表达式的方法: * test() * - 使用这个方法可以用来检查一个字符串是否符合正则表达式的规则, * 如果符合则返回true,否则返回false */ var result = reg.test(str); console.log(result); console.log(reg.test("Ac")); </script> |
运行代码控制台打印结果:
2、判断是否含有对应字符串
<script type="text/javascript"> /* * 使用字面量来创建正则表达式 * 语法:var 变量 = /正则表达式/匹配模式 * 使用字面量的方式创建更加简单 * 使用构造函数创建更加灵活 * */ var reg = /a/i; console.log(typeof reg); console.log(reg.test("abc")); //创建一个正则表达式,检查一个字符串中是否有a或b /* * 使用 | 表示或者的意思 */ reg = /a|b|c/; /* * 创建一个正则表达式检查一个字符串中是否有字母 */ //reg = /a|b|c|d|e|f|g/; /* * []里的内容也是或的关系 * [ab] == a|b * [a-z] 任意小写字母 * [A-Z] 任意大写字母 * [A-z] 任意字母 * [0-9] 任意数字 */ reg = /[A-z]/; //检查一个字符串中是否含有 abc 或 adc 或 aec reg = /a[bde]c/; /* * [^ ] 除了 */ reg = /[^ab]/; reg = /[^0-9]/; console.log(reg.test("12a3456")); </script> |
运行结果:
3、字符串和正则相关的方法
<script type="text/javascript"> var str = "1a2b3c4d5e6f7"; /* * split() * - 可以将一个字符串拆分为一个数组 * - 方法中可以传递一个正则表达式作为参数,这样方法将会根据正则表达式去拆分字符串 * - 这个方法即使不指定全局匹配,也会全都插分 * 根据任意字母来将字符串拆分 */ var result = str.split(/[A-z]/); console.log(result); /* * search() * - 可以搜索字符串中是否含有指定内容 * - 如果搜索到指定内容,则会返回第一次出现的索引,如果没有搜索到返回-1 * - 它可以接受一个正则表达式作为参数,然后会根据正则表达式去检索字符串 * - serach()只会查找第一个,即使设置全局匹配也没用 */ str = "hello abc hello aec afc"; /* * 搜索字符串中是否含有abc 或 aec 或 afc */ result = str.search(/a[bef]c/); console.log(result); /* * match() * - 可以根据正则表达式,从一个字符串中将符合条件的内容提取出来 * - 默认情况下我们的match只会找到第一个符合要求的内容,找到以后就停止检索 * 我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容 * 可以为一个正则表达式设置多个匹配模式,且顺序无所谓 * - match()会将匹配到的内容封装到一个数组中返回,即使只查询到一个结果 * * */ str = "1a2a3a4a5e6f7A8B9C"; result = str.match(/[a-z]/ig); console.log(result[2]); /* * replace() * - 可以将字符串中指定内容替换为新的内容 * - 参数: * 1.被替换的内容,可以接受一个正则表达式作为参数 * 2.新的内容 * - 默认只会替换第一个 */ //result = str.replace(/[a-z]/gi , "@_@"); result = str.replace(/[a-z]/gi , ""); console.log(result); </script> |
运行结果:
4、判断手机号
<script type="text/javascript"> /* * 创建一个正则表达式检查一个字符串中是否含有aaa */ /* * 量词 * - 通过量词可以设置一个内容出现的次数 * - 量词只对它前边的一个内容起作用 * - {n} 正好出现n次 * - {m,n} 出现m-n次 * - {m,} m次以上 * - + 至少一个,相当于{1,} * - * 0个或多个,相当于{0,} * - ? 0个或1个,相当于{0,1} */ var reg = /a{3}/; //ababab reg = /(ab){3}/; reg = /b{3}/; reg = /ab{1,3}c/; reg = /ab{3,}c/; reg = /ab+c/; reg = /ab*c/; reg = /ab?c/; console.log(reg.test("abbc")); /* * 检查一个字符串中是否以a开头 * ^ 表示开头 * $ 表示结尾 */ reg = /^a/; //匹配开头的a reg = /a$/; //匹配结尾的a console.log(reg.test("abcabca")); /* * 如果在正则表达式中同时使用^ $则要求字符串必须完全符合正则表达式 */ reg = /^a$/; console.log(reg.test("bbca")); /* * 创建一个正则表达式,用来检查一个字符串是否是一个合法手机号 * * 手机号的规则: * 13345678901 (11位) * 1. 以1开头 * 2. 第二位3-9任意数字 * 3. 三位以后任意数字9个 * ^1 [3-9] [0-9]{9}$ */ var phoneStr = "13345678901"; var phoneReg = /^1[3-9][0-9]{9}$/; console.log(phoneReg.test(phoneStr)); </script> |
运行结果:
5、判断邮箱
<script type="text/javascript"> /* * 电子邮件 * hello .nihao @ abc .com.cn * 任意字母数字下划线 .任意字母数字下划线 @ 任意字母数字 .任意字母(2-5位) .任意字母(2-5位) * \w{3,} (\.\w+)* @ [A-z0-9]+ (\.[A-z]{2,5}){1,2} */ var emailReg = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/; var email = "soleilluo@163.com"; console.log(emailReg.test(email)); </script> |
运行结果: