如何使用正则表达式

大家好,我是IT修真院深圳分院第06期学员,一枚正直善良的web程序员。

今天给大家分享一下,修真院官网 JS-05任务中可能会使用到的知识点:


1.背景介绍

什么是正则表达式?

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。

正则表达式是由一个字符序列形成的搜索模式。当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。正则表达式可以是一个简单的字符,或一个更复杂的模式。正则表达式可用于所有文本搜索和文本替换的操作。

正则表达式中包含三种元素分别为:量词、元字符、修饰符。


2.知识剖析

如何使用正则表达式
语法
/正则表达式主体/修饰符(可选)
其中修饰符是可选的。

举例:
方式一:直接量语法
var test = /jnshu/;
var test = /jnshu/i;
方式二:创建 RegExp 对象的语法
var test = new RegExp("jnshu");
var test = new RegExp("jnshu","i");
TEST()方法

test() 方法是一个正则表达式方法。
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

/123456/.test("12345");            // false
/123456/.test("123456");           // true
/123456/.test("x123456y");         // true        只要包含了指定的字符串,则为true
修饰符

修饰符是影响整个正则规则的特殊符号,会对匹配结果和部分内置函数行为产生不同的效果。

i   执行对大小写不敏感的匹配。
g   执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m   执行多行匹配。
y   执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。
元字符

元字符是使用正则表达式不同于普通字符的地方,也是正则表达式能够发挥强大作用、具有强大表达能力的法宝。
那么什么是元字符呢?
元字符是一些在正则表达式中有特殊用途、不代表它本身字符意义的一组字符。利用元字符,我们可以控制字符串匹配的方式,例如:只在每一行的开始或结束位置匹配指定的模式,匹配固定距离的子串,匹配不出现的字符等等。

常用元字符
\d : 匹配数字      等价于[0-9]
\D : 匹配非数字    等价于[^\d]
\s : 匹配空白符
\S : 匹配非空白符  等价于[^\s]
\w : 用于匹配字母,数字或下划线字符(例如程序中的变量字符)  等价于[A-Za-z0-9_] 
\W : 用于匹配所有与\w不匹配的字符   等价于[^\w]
举例:
/\d/.test("123");              // true
/\d/.test("1ab");              // true
/\D/.test("1ab");              // true
/\D/.test("112");              // false

字符类
匹配一类字符中的一个
[abc]: a或b或c 
[0-9]: 一个数字
[^0-9]: 非数字的一个字符
[a-z]: 一个字母
.    : 任一字符(换行除外)

多选分支
或
/thi(c|n)k/    ===    /thi[cn]k/        // thick或think

锚点
匹配一个位置
^ :起始位置
$ :结尾位置
\b :单词边界
举例:
/^http:/       /^http:/.test("http://www.jnshu.com")   //true 
/\.jpg$/       /\.jpg$/.test("1.jpg")                  // true
/\bis\b/       /\bis\b/.test("this is tom")            // true

如果要在正则表达式中使用元字符本身的话该怎么办?

转义符

使用的方法是把一个反斜杠(\)放在元字符前面,这样元字符就失去了特殊的意义,还原会它本身代表的字符意义。

举例:
/http:\/\//     /http:\/\//.test("http://www.jnshu.com")        // true
量词

正则表达式的量词分别是贪婪,惰性,支配性:

  • 贪婪量词:先看整个字符串是不是一个匹配。如果没有发现匹配, 它去掉最后字符串中的最后一个字符,并再次尝试。
  • 惰性量词: 先看字符串中的第一个字母是不是一个匹配。如果单独 这一个字符还不够,就读入下一个字符,组成两个字符的字符串。 如果还是没有发现匹配,惰性量词继续从字符串添加字符 直到发现一个匹配或者整个字符串都检查过也没有匹配。
  • 支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做 进一步尝试,支配量词其实简单的说,就是一刀切。
    惰性量词和贪婪量词的工作方式正好是相反的。
    表示这3种量词:
贪   婪        惰   性       支   配               描   述
    ?           ??           ?+               零次或一次出现
    *            *?            *+                零次或多次出现
    +            +?            ++                一次或多次出现
    {n}          {n}?          {n}+              恰好n次出现
    {n,m}       {n,m}?       {n,m}+           至少n次,最多m次出现
    {n,}        {n,}?        {n,}+            至少n次出现

举例:
/\d*/.test("abc")       // true     数字可以出现0次到无穷次,所以是对的
/\d+/.test("abc")       // false    数字至少出现1次到无穷次,所以是错的
/\d+/.test("1abc")      // true     数字至少出现1次到无穷次,所以是对的
/https?:/.test("http://www.jnshu.com")       // true     s可以出现0次到1次,所以是对的
/https?:/.test("https://www.jnshu.com")      // true     
/https?:/.test("httpss://www.jnshu.com")     // false    s后面是:所以是错的
贪婪匹配原则

在JavaScript中,正则表达式进行匹配时默认使用的是贪婪匹配原则,即尽可能多的匹配字符串。例如,使用正则表达式/1{3,4}/来匹配字符串1111111,得到的结果为:1111和111。即先匹配4个字符,然后才匹配3个字符。


3.常见问题

如何利用正则表达式获取URL中各部分的值?


4.解决方案

捕获
保存匹配到的字符串,日后再用

()   :捕获           /(jnshu)/
(?:) :不捕获         /(?:jnshu)/
url由协议、主机、端口、路径、搜索、哈希值组成
http://www.jnshu.com:8080/index.html?user=chenapo&age=99#home
  |          |         |       |             |            |
protocol     |         |       |             |            |
          hostname    port     |             |            |
              \        /    pathname        search        hash
                 host    
获取URL中各部分的值

5.编码实战


6.扩展思考

常用正则表达式有哪些?
PS:给出的这篇教程中某些正则表达式是错误,大家使用时测试一下。


7.参考文献

参考文献:
菜鸟教程
正则表达式的量词解释


8.更多讨论

问题1:正则表达式最常用的应用场景?
答:总体来说,正则表达式有三类主要应用:
(1)测试字符串的某个模式。例如,可以输入一个字符串进行测试看该字符串中是否存在一个电话号码模式或者一个信用卡模式,这成为数据的有效性检验。
(2)替换文本。可以再文档中使用一个正则表达式来表示特定文字,然后可以将其全部删除或者替换成别的文字。
(3)根据模式匹配从字符串中提取一个子字符串。可以用来在文本或者输入字段中查找特定的文字。
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

问题2:var a=/Android/,在这里//代表什么?
答:在正则表达式中,/顺斜杠是表示表达式的开始和结束的“定界符”。

问题3:正则表达式中还有什么其他方法?

答:

视频
PPT

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

推荐阅读更多精彩内容