JavaScript 学习 (3)-- 正则表达式

正则表达式(Regular Expression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作。

1. 创建正则表达式

正则表达式由 pattern(正则表达式主体)flags(修饰符, 可选)两部分组成。 但是有不同的定义的方式:一种是字面量定义的方式,一种是构造函数定义的方式。

A. 概念:
  • pattern: 可以是任何简单或复杂的正则表达式。 pattern中使用的所有元字符都必须转义,转义需要用转义字符,反斜杠。
  • flags: 每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。 包括三个匹配模式: g (全局模式), i (不区分大小写模式), m (多行模式)
B. 定义:
  1. 字面量: 正则表达式包含在一对斜杠(/)之间的字符,如果需要使用特殊字符,就需要使用一个反斜杠,\[ 代表的就是 [
var testReg = /pattern(正则表达式主体)/flags(修饰符, 可选)
var testReg = /\[bc\]at/i;     //查找不区分大小写的[bc]at
  1. 构造函数: 通过 RegExp() 构造函数来定义。使用构造函数定义,有两个参数,这两个参数都是字符串。字符串中,任何字符加反斜杠则表示字符本身,所以如果要使用特殊字符,就需要使用两个反斜杠, \\[ 代表的就是 [
var testReg = new RegExp('pattern(正则表达式主体)', 'flags(修饰符, 可选)')
var testReg = new RegExp('\\[bc\\]at', 'i')   // 查找不区分大小写的[bc]at,但是 \ 要进行转义,所以是\\

2. 正则表达式的符号意义

A. 特殊含义的字符匹配
  1. ^ -- 匹配输入的开始
'Abc'.match(/^A/);                     // 'A'
  1. $ -- 匹配输入的结束
eateat'.match(/t$/);                   //'t'
  1. . -- 匹配除换行符之外的任何单个字符,查找单个字符,除了换行和行结束符
"nay, there is no any apple on the tree".match(/.n/);    // 
  1. \w -- 查找单词字符
'ad12~@@!wg'.match(/\w/g);         //["a", "d", "1", "2", "w", "g"] 
  1. \W -- 查找非单词字符
'ad12~@@!wg'.match(/\W/g);        //["~", "@", "@", "!"] 
  1. \d -- 查找数字
'ad12~@@!wg'.match(/\d/g);        //["1", "2"]
  1. \D -- 查找非数字字符
'ad12~@@!wg'.match(/\D/g);        //["a", "d", "~", "@", "@", "!", "w", "g"]
  1. \s -- 查找空白字符
'abceee efg'.match(/e\s/g);       //["e "]
  1. \S -- 查找非空白字符
'abceee efg'.match(/\S/g);       //["a", "b", "c", "e", "e", "e", "e", "f", "g"]
  1. \b -- 匹配单词边界
 'abcde@(2020 f7.g2!9'.match(/\b(\w+)/g);  //["abcde", "2020", "f7", "g2", "9"]
  1. \B -- 匹配非单词边界
'abcde@(2020 f7.g2!9'.match(/\b(\w+)/g);   //["bcde", "020", "7", "2"] 
  1. \n -- 查找换行符
'abcd\nef'.match(/\n/).index;     //4
  1. \f -- 查找换页符
'abcd\fef'.match(/\f/).index;  //4
  1. \r -- 查找回车符
  2. \t -- 查找制表符
  3. \v -- 查找垂直制表符
B. 字符范围匹配

在正则表达式语法中,方括号表示字符的范围。在方括号中可以包含多个字符,表示匹配其中任意一个字符。如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。

  1. [abc] -- 查找方括号中任意一个字符
"abbccee".match(/[abc]/g);       //["a", "b", "b", "c", "c"]
  1. [^abc] -- 查找不在方括号内的字符
"abbccee".match(/[abc]/g);       //["e", "e"]
  1. [0-9] -- 查找从 0 至 9 范围内的数字,即查找数字
"a12bc@89!".match(/[0-9]/g);    // ["1", "2", "8", "9"]
  1. [a-z] -- 查找从小写 a 到小写 z 范围内的字符,即查找小写字母
"a12bc@89!".match(/[a-z]/g);    ["a", "b", "c"]
  1. [A-Z] -- 查找从大写 A 到大写 Z 范围内的字符,即查找大写字母
"A12bc@89!".match(/[A-Z]/g);    // ["A"]
  1. [A-z]| -- 查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母
"A12bc@89!".match(/[A-z]/g);   //["A", "b", "c"]
C. 重复类量词匹配

重复类量词总是出现在它们所作用的字符或子表达式后面。如果想作用于多个字符,需要使用小括号把它们包裹在一起形成一个子表达式。

  1. * -- 匹配前一个表达式0次或多次,等价于 {0,}
"A ghost boooooed".match(/bo*/);      // 'booooo'
"A ghost b".match(/bo*/);             // 'b'
  1. + -- 匹配前面一个表达式1次或者多次。等价于 {1,}
"candy".match(/a+/);                 // 'a'
"caaaaaaandy".match(/a+/);           // 'aaaaaaa'
  1. ? -- 匹配前面一个表达式0次或者1次。等价于 {0,1}
"angel".match(/e?le?/);             //'el'
  1. n{x} -- 匹配包含 x 个 n 的序列的字符串
  2. n{x,y} -- 匹配包含最少 x 个、最多 y 个 n 的序列的字符串
  3. n{x,} -- 匹配包含至少 x 个 n 的序列的字符串
var s = "ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";

s.match(/go{2}gle/g);         //["google"]
s.match(/go{3,5}gle/g);     //["gooogle", "goooogle", "gooooogle"]
s.match(/go{6,}gle/g);     //["goooooogle", "gooooooogle", "goooooooogle"]

2. 常用的正则表达式

验证Email地址: ^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证身份证号(15位或18位数字): ^\d{15}|\d{}18$

中国大陆手机号码: 1\d{10}
中国大陆固定电话号码: (\d{4}-|\d{3}-)?(\d{8}|\d{7})
中国大陆邮政编码: [1-9]\d{5}

IP地址: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

日期(年-月-日): (\d{4}|\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9]))
日期(月/日/年): ((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\d{4}|\d{2})

你可能感兴趣的:(JavaScript 学习 (3)-- 正则表达式)