javascript正则表达式(一)

2019-10-15  本文已影响0人  成熟稳重的李先生

regular expression: RegExp
正则,是用来处理字符串的规则

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.可能出现+-号,也可能没有
  * 2. 一位时,0-9都可以;多位时,首位不能为0
  * 3. 小数部分可能有也可能没有,一旦有,后边必须有小数点+数字
  */
let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
/  *
  *  数字,字母,下划线
  * 6-16位
*/
let reg = /^\w{6, 16}$/;  //一定注意不能写成 /^\w+{6,16}$/,因为w+和后边表示位数的修饰符冲突了
/   *
    * 1. 汉字  /^[\u4E00-\u9FA5]/  (背诵)
    * 2. 名字长度 2~10位
    * 3. 译名,可能有 “·”+汉字   “尼古拉斯·赵四”
    */
let reg = /^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10}){0,2}$/
/  *@之前
  * 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]+$/
/ * 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")

两个正则图形化工具

https://jex.im/regulex/
https://regexper.com/

上一篇下一篇

猜你喜欢

热点阅读