javascript正则表达式(一)
2019-10-15 本文已影响0人
成熟稳重的李先生
regular expression: RegExp
正则,是用来处理字符串的规则
- 只能处理字符串
- 它是一个规则: 可以验证字符串是否符合某个规则(test), 也可以把字符串中符合规则的内容捕获到(exec/或者字符串的match)
let str = "welcome";
let reg = /\d+/; // "+"代表1到多个,d代表数字
reg.test(str); // "test"方法,表示是否满足规则,显然,此处应该返回false
str = "2019-08-12";
reg.exec(str) // => ["2019", index: 0, input: "原始字符串"]
编写正则表达式:
创建方式有两种
// => 字面量创建方式(两个斜杠之间包起来的,都是用来描述规则的元字符)
let reg1 = /\d+/;
// => 构造函数模式创建, 包含两个参数:元字符字符串 修饰符字符串
let reg2 = new RegExp("\\d+"); //与字面量方式不同的是,转义符要写两个
正则表达式有两部分组成
- 元字符
//常用元字符
1. 量词元字符: 设置出现的次数(6种)
*: 零到多次;
+ : 一到多次;
?: 零次或者一次
{n}: 出现n次;
{n, }: n到多次;
{n, m}: 出现n到m次 (这三个都是闭区间)
2. 特殊元字符: 单个或者组合在一起代表特殊的含义
\ 转义字符 (普通 -> 特殊 -> 普通)
. 除\n(换行符)以外的任意字符
^ 以哪一个元字符作为开始
$ 以哪一个元字符作为结束
\n 换行符
\d 0~9 之间的一个数字
\D 非数字 (大写和小写意思是相反的)
\w 数字,字母,下划线中的任意一个字符
\W
\s 一个空白字符(包含空格、制表符、换页符等)
\S 非空字符
\b 匹配一个单词的边界
\t 一个制表符(一个TAB键: 四个空格)
| 或(x|y -> x或者y中的一个字符)
[xyz] 匹配x,y,z中的一个字符
[^xy] 除了x,y以外的任意字符
[a-z] 指定a-z这个范围中的任意字符(类比[0-9],[A-Z])
//[a-z0-9A-Z_]匹配a到z或者0到9或者A到Z再或者_中的任意一个 === \w
[^a-z] [a-z]取反
() 正则中的分组符号
(?:) 只匹配,不捕获
(?=) 正向预查
(?!) 负向预查
3. 普通元字符: 代表本身含义的
/abc/ 此正则就是匹配字符串“abc”
- 修饰符
/*正则表达式常用的修饰符: img*/
i: ignoreCase 忽略单词大小写匹配
m: multiline 可以进行多行匹配
g: global 全局匹配
/A/.test("lalala") => false;
/A/i.test("lalala") => true; // 忽略了大小写
元字符详细解析
^ $
let reg = /^\d/;
reg.test("regexp"); //false
reg.test("2019regexp"); //true
reg.test("regexp2019"); //false
let reg = /\d$/
reg.test("regexp"); //false
reg.test("2019regexp"); //false
reg.test("regexp2019"); //true
// ^,$都不加 (字符串中包含符合规则的内容即可)
let reg = /d+/;
// ^, $都加: 字符串只能是和规则一致的内容
let reg = /^\d+$/;
// 验证手机号码(11位,第一个数字是1即可)
let reg = /^1\d{10}$/;
转义字符
let reg = /^2.3$/ // . 不是小数点
console.log(reg.test("2.3")) //true
console.log(reg.test("2@3")) //true
console.log(reg.test("23")) //false (.表示任意字符,但必须有)
//想要表示小数点,需要将.转义
let reg = /^2\.3$/;
let str = "\d"; \\要表示“\d”这个字符串,要这样写“\\d”
reg = /\\d/; // 这里转义字符的用处是将特殊字符转化为普通字符串
console.log(reg.test(str)) // false (因为\在字符传中也是有特殊含义的)
console.log(reg.test("\\d")) //true (字符串中也需要转义字符再转义)
x|y
let reg = /^18|29$/;
console.log(reg.test("18")) // true
console.log(reg.test("29")) // true
console.log(reg.test("129")) // true
console.log(reg.test("189")) // true
console.log(reg.test("1829")) // true
console.log(reg.test("829")) // true
console.log(reg.test("182")) // true
//以上均为true,其实,我只是想匹配18或者29中的一个。 直接x|y会存在很乱的优先级问题,一般这种时候都伴随着小括号来进行分组,小括号可以改变处理的优先级 => 小括号: 分组
reg = /^(18|29)$/;
console.log(reg.test("18")) // true
console.log(reg.test("29")) // true
console.log(reg.test("129")) // false
console.log(reg.test("189")) // false
[]
//1. 中括号中出现的字符一般都代表本身的含义
let reg = /^[@+]+$/; // 第一个+,就是根本的+,第二个+是元字符(一个或者多个)
reg.test("@@");
reg.test("@+");
// 也有特殊的
reg = /^[\d]$/; // => \d在中括号中还是代表0-9
console.log(reg.test("d")); //false
console.log(reg.test("\\")); //false
console.log(reg.test("9")); //true
// 2. 中括号中不存在多位数
reg = /^[18]$/;
console.log(reg.test("1")); //true
console.log(reg.test("8")); //true
console.log(reg.test("18")); //false
常用的正则表达式
- 1.验证是否为有效数字
/ *
* 规则分析
* 1.可能出现+-号,也可能没有
* 2. 一位时,0-9都可以;多位时,首位不能为0
* 3. 小数部分可能有也可能没有,一旦有,后边必须有小数点+数字
*/
let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
- 2.简单验证密码
/ *
* 数字,字母,下划线
* 6-16位
*/
let reg = /^\w{6, 16}$/; //一定注意不能写成 /^\w+{6,16}$/,因为w+和后边表示位数的修饰符冲突了
- 3.验证真实姓名的
/ *
* 1. 汉字 /^[\u4E00-\u9FA5]/ (背诵)
* 2. 名字长度 2~10位
* 3. 译名,可能有 “·”+汉字 “尼古拉斯·赵四”
*/
let reg = /^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10}){0,2}$/
- 4.验证邮箱的
/ *@之前
* 1.开头是数字,字母,或者下划线(1到多位)
* 2.接着可以是 “-”加数字字母下划线 或者 “.”加数字,字母下划线。整体零到多次
* a-b-c,a-b.c, a.b.c
* 邮箱的名字由“数字,字母,下划线,-,.”几部分组成,但是-和.不能连续出现,也不能作为开始出现
* @之后
* 1. @后紧跟着:数字,字母 (1到多位)
* 2. ((\.|-)[A-Z0-9a-z]+)*
* 对@后边的名字的补充(匹配"45314515@16.com.cn"中的“.com”)
* 企业邮箱 zxt@zhufeng-peixun-office.com (匹配“-peixun-office”)
* 3. 最后 \.[A-Z0-9a-z]+
* 用来匹配邮箱后缀 (.com/.cn/.org/.edu.....)
*/
let reg = /^\w+((-\w+)|(\.\w+))*@[A-Z0-9a-z]+((\.|-)[A-Z0-9a-z]+)*\.[A-Z0-9a-z]+$/
- 5.身份证号码
/ * 1. 一共18位
* 2. 最后一位可能是X
* 3. 身份证前六位: 省市县
* 中间八位: 年月日
* 最后四位:
* 最后一位: X或者数字
* 倒数第二位 => 偶数 女, 奇数 男
* 其余是经过算法算出来的
*/
//let reg= /^\d{17}(\d|x)$/;
// => 小括号分组的第二个作用:分组捕获,不仅可以把大正则匹配的信息捕获到,还可以单独捕获到每个小分组的内容
let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|x)$/ //捕获的结果是数组,包含每一个小分组单独获取的内容
正则两种创建方式的区别
在字符串中两个“\”,才是“\”的意思, 因此:
let reg = /\d+/g;
// 等同于:
let reg = new RegExp("\\d+", "g")
//正则包变量
// 1. 两个斜杠中间包起来的都是元字符 (如果正则中要包含某个变量的值,则不能使用字面量方式创建)
let type = "welcome"
// 只能使用构造函数的方式(因为它传递的规则是字符串,只有这样才能进行字符串拼接)
let reg = new RegExp("^@"+type+"@$", "g")