JS基础(五)---正则表达式

正则语法

正则表达式的创建方式

  • 使用正则表达式字面量,用两个/ 来表示 ,/正则表达式/
    var reg = /abc/

  • 使用RegExp对象的构造函数,new RegExp("正则表达式",“imgs”)
    第一个参数 是 正则表达式 , 第二个参数 是 后缀修饰符
    var reg= new RegExp("abc")

正则表达式的组成

由一些普通字符和一些特殊字符(又叫元字符--metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。

特殊字符:javascript 中常用特殊字符有 ( ) [ ] { } \ ^ $ | ? * .+

如果正则表达式中包含以上的特殊字符, 则需要使用 转义符 \ 对其进行转义,如: \(\^\\

预定义特殊字符:
\t 制表符
\n 回车符
\f 换页符
\b 空格

正则表达式字符集

  • 最简单的正则
    关键字原文
    /abc/ -----> 匹配的是 "abc"
备选字符集 ---[]

某一个可用的备选字符列表,使用[备选的字符列表]

var  str = "out ont o1t ";
console.log(str.match(/o[usb]t/g));   // ["out"]
  • 连续备选字符
    若备选的字符列表太多,且类型相同,全部输入太麻烦,可以在 中间加了个横线 -,将字符连起来,如[a-z]、[0-9]、[A-Z]、[0-9a-z]
var  str = "out ont o1t ";
console.log(str.match(/o[0-9a-z]t/g));   //  ["out", "ont", "o1t"]
  • 反向: [] 前面加个元字符进行取反,表示匹配不能为括号里面的字符。[^0-9] --->除去0-9的关键字符
var  str = "out ont o1t ";
console.log(str.match(/o[^0-9]t/g));    // ["out", "ont"]

一个中括号,只能匹配到一个字符

预定义备选字符集

\d ---------> [0-9]
\w ---------> [0-9a-zA-Z]
\s ---------> [ \t\n\x0B\f\r] 匹配所有的空字符,如:空格、制表符、换行
. ---------> [^\n\r] 除了换行和回车 后的任意字符
\D ---------> [^0-9] 非数字字符
\W ---------> [^a-zA-Z_0-9] 非单词字符
\S ---------> [^ \t\n\x0B\f\r] 非空白字符
[\u4e00-\u9fa5] -----> 中文字符集

量词 ---{}

规定相邻的前一个字符集出现的次数

写法 含义
{n} 必须n次
{n,m} 至少出现 n 次但不超过 m 次(中间不能有空格)
{n,} 至少出现n次(+的升级版)
? 出现零次或一次(最多一次)
* 出现零次或多次(任意次)
+ 出现一次或多次(至少一次)
分组 ---()

分组,在正则表达式中用()包裹起来的内容代表一个分组

  • 分组的反向引用
  • 正则表达式中的每个(),都是一个子表达式,每个子表达式都会自动获得一个从 1 开始的编号
  • 在正则表达式内部,可用 \编号 形式 来表示 分组中的第i个子表达式匹配到的内容,如 /(a)\1/ --> 表示匹配 字符为aa 的内容
  • 而在正则表达式外,可用n表示本次匹配中第n个子表达式所匹配到的对应内容,RegExp.n,常用于replace()方法中
$的表示方式
  • $i:(i取值范围1~99),表示从左到右正则子表达式所匹配的内容
  • $&:表示与正则表达式匹配的全部内容
  • $`: ($ + `,反引号):表示匹配字符串的左边内容
  • $':($ + ' 单引号),表示匹配字符串的右边内容
var date = "20201225一下065959";
var reg = /(\d{4})(\d{2})(\d{2})([\u4e00-\u9fa5])([\u4e00-\u9fa5])(\d{2})(\d{2})(\d{2})/;
//               2020    12      25             一                       下               06      59      59
//                $1    $2        $3            $4                       $5                 $6      $7    $8 
date = date.replace(reg, "$1年$2月$3日 星期$4 $5午 $6:$7:$8");
console.log(date)

var dateStr = '2020-12-25';
var reg = /(\d{4})-(\d{2})-(\d{2})/;
console.log(reg.test(dateStr)); //true
console.log(RegExp.$1) //2020
console.log(RegExp.$2) //12
console.log(RegExp.$3) //25
选择 ---|

字符 | 用于分隔供选择的字符,可理解为 “或”,表示在多个选择项中选择一个,在正则的优先级中非常低

  • 匹配选择的规则

选择项是从左到右考虑,直到发现了匹配项。如果左边的选择项匹配,则忽略右边的匹配项,即使它产生更好的匹配。

边界 --- ^$
  • ^ 匹配开始位置 (注意与[^]区分开)
    表示限制开头,后面的正则内容匹配的结果必须出现在字符串开始

  • $ 匹配结束位置
    表示限制结尾,前面的正则内容匹配的结果必须出现在字符串结尾

  • 前加^后加$ ,且中间没有 |, 表示同时限制开头和结尾,中间的字符必须与正则表达式完全匹配

  • \b: 表示单词的边界 如: \bno\b 只匹配单词no,如果匹配独立的单词,则两边同时加 \b

正则表达式 后缀修饰符

g --->(global) 修饰符用于执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
i --->(ignore case)修饰符用于执行对大小写不敏感的匹配
m --->(multiline)修饰符用于多行模式执行的匹配(若正则表达式没有^$匹配字符串的开头或结尾,那么/m修饰符没有任何意义)
s ---> (singleline),dotAll标志,匹配任意字符,包括换行,解决.匹配的缺点(除了换行和回车 后的任意字符),与m不同,m只影响^$,而s只影响.

相关的正则方法

字符串的方法

split()

根据匹配字符串切割父字符串

// 通过空格字符串进行分割
var str = "aa bbb    c dd eeeeee";
console.log(str.split(/\s+/));       // ["aa", "bbb", "c", "dd", "eeeeee"]
search()

对正则表达式或指定字符串进行搜索,返回第一个出现的匹配项的下标。如果未找到,则返回 -1

// 查询子串在父字符串中出现的位置
var str = "abcdefg";
console.log(str.search(/cd/));  //  2
console.log(str.search(/cdf/));  //  -1
match()

使用正则表达式与字符串相比较,返回一个包含匹配结果的数组
默认是只返回第一个找到的关键词就结束
在正则表达式后 加上后缀 g,能够匹配到所有关键词的 数组
如果未找到,则返回null

在使用此方法时,需要先判断匹配的结果kwords是否为 null,再对结果进行使用数组的相关方法,如 kwords.length

// 在父字符串中去匹配符合的子字符串
var str = "abbcccbbbbbddbbbdabbb";
console.log(str.match(/b+/));  // ["bb"]
console.log(str.match(/b+/g));  // ["bb", "bbbbb", "bbb", "bbb"]
replace()

用正则表达式和字符串直接比较,然后用新的子串来替换被匹配的子串
默认匹配第一个符合的子串 就结束
匹配所有符合的关键词,需要加 后缀 g

// 替换字符串的指定部分,返回值是一个新的替换后的字符串
var str = "aa abb acc add";
console.log(str.replace(/a+/,"A"));  //  "A abb acc add"
console.log(str.replace(/a+/g,"A")); // "A Abb Acc Add"

RegExp对象的方法

exec()

查找匹配的字符串,输出到数组中,既获得每个关键字的内容,又获得每个关键字的位置,但只会在找到第一个之后直接中止。
形如: var arr = reg.exec(str);,表示从str中查找符合reg要求的关键词的位置和内容,并保存在数组arr中

特点

  • 返回的结果为数组,每次只返回一个关键字的内容,新的关键字替换上一个,保存在arr[0]中,如果找不到,则返回null
  • 将本次找到的关键字的位置保存在arr.index中
  • 自动调整,reg.lastIndex属性为下次开始的查找位置(默认从0开始),因此每个关键字都是arr[0],因为会被替换

因此,根据以上exec()存在的特点,可以通过 循环遍历使用该方法来获取所有符合关键字的内容(需要加后缀修饰符 g

test()

检测字符串中是否满足正则表达式的匹配规则,返回值是布尔值
形如:reg.test(str);,如果str符合reg的要求,则返回 true,表示验证通过,否则为false,验证失败

一般在做验证中,会配合^$一起使用,否则会出现 局部匹配 就验证通过的情况

深入学习正则表达式,推荐看这本书《JavaScript 正则迷你书》

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

推荐阅读更多精彩内容