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})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354