正则表达式

正则表达式(Regular Expression)是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

正则表达式就像筛子一样,从目标字符串中筛出我们需要的内容.

RegExp类型

ECMAScript通过RegExp类型来支持正则表达式
其语法类似Perl的语法:
形式为 * var expression = / pattern / flags; *

  • pattern(模式)部分可以是任何简单或者复杂的正则表达式,可以包含字符类,限定符,分组,向前查找和反向引用;

  • 每个正则表达式都可带 一或多个标志(flags),用以标明正则表达式的行为;

1.1-----正则表达式的匹配模式支持以下三个标志:

  • g: 表示为全局(global)模式,及模式将被应用于所有的字符串,而非发现第一个匹配项立即停止;

  • i: 表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;

  • m:表示多行(multiline)模式,即在到达一行文本的末尾时还会继续查找下一行中是否存在与模式匹配的项;

1.2-----元字符

正则表达式让人望而却步以一个重要原因就是转义字符太多了,组合非常多,但是正则表达式的元字符(在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符)并不多:

  • ( 小括号
  • [ 方括号(中括号)
  • { 花括号
  • \ 正斜线
  • ^ 顶三角
  • $ 美元符
  • | 竖线
  • ) 小括号
  • ? 问号
  • * 星号
  • + 加号
  • . 点号

并不是每个元字符都有特定的意义,在不同的组合中元字符有不同的意义,分类看一下:
\t -----------------水平制表符(即table按键产生的效果,会生成8个空格)
\r -----------------回车符(即enter键的效果)
\n -----------------换行符(顾名思义,会产生换行效果)
\f -----------------换页符(应该是针对打印机的命令,走纸换页是针对打印机输出时的命令符)
\cX -----------------与X对应的控制字符(Ctrl+X)
\v -----------------垂直制表符(垂直制表符应该垂直空几个格,效果类似于连续enter几下)
\0 -----------------空字符(代表为空null)

1.3----字符类

一般情况下正则表达式一个字符(转义字符算一个)对应字符串一个字符,表达式 ab\t 的含义是;

但是我们可以使用元字符[]来构建一个简单的类,所谓类是指,符合某些特征的对象,是一个泛指,而不是特指某个字符了,我们可以使用表达式 [abc] 把字符a或b或c归为一类,表达式可以匹配这类的字符


1.4----取反

元字符[]组合可以创建一个类,我们还可以使用元字符^创建反向类/负向类,反向类的意思是不属于XXX类的内容,表达式 [^abc] 表示不是字符a或b或c的内容

1.5----范围类

我们可以使用 x-y来连接两个字符表示从x到y的任意字符,这是个闭区间,也就是说包含x和y本身,这样匹配小写字母就很简单了

1.6----预定义类

预定义类 范围 含义
. [^\r\n] 除了回车符和换行符之外的所有字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\t\n\x0B\f\r] 空白符
\S [^\t\n\x0B\f\r] 非空白符
\w [a-zA-Z_0-9] 单词字符,字母、数字下划线
\W [^a-zA-Z_0-9] 非单词,字符,下划线
[\x{4e00}-\x{9fa5}] 表示utf8编码之后的中文范围内中的任意一个

转义字符相关

1.7----边界

正则表达式还提供了几个常用的边界匹配字符

字符 含义
^ 以xxx开头
$ 以xxx结尾
\b 单词边界
\B 非单词边界

1.8----量词

字符 含义
? 出现零次或一次(最多出现一次)
+ 出现一次或多次(至少出现一次)
* 出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次

1.8----贪婪模式与非贪婪模式

  • 量词在默认下是尽可能多的匹配的,也就是大家常说的贪婪模式;
  • 既然有贪婪模式,那么肯定会有非贪婪模式,让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试,做法很简单,在量词后加上?即可

分组,或,分组嵌套,忽略分组,前瞻(待补充完善)

  • 使用() 进行分组;
    使用()将想要进行操作的字符串进行分组;

  • 使用字符|达到或的功效
    | 该字符表示或,效果类似于逻辑或;

  • 前瞻:
    exp1(?=exp2) 匹配后面是exp2的exp1
    exp1(?!exp2) 匹配后面不是exp2的exp1


2相关方法

2.1------RegExp实例对象有五个属性

  • RegExp实例对象有五个属性

  • global:是否全局搜索,默认是false

  • ignoreCase:是否大小写敏感,默认是false

  • multiline:多行搜索,默认值是false

  • lastIndex:是当前表达式模式首次匹配内容中最后一个字符的下一个位置,每次正则表达式成功匹配时,lastIndex属性值都会随之改变

  • source:正则表达式的文本字符串

2.2----RegExp.prototype.test(str)

该方法用于测试字符串参数中是否存正则表达式模式,如果存在则返回true,否则返回false.

2.3-----RegExp.prototype.exec(str)

方法用于正则表达式模式在字符串中运行查找,如果exec()找到了匹配的文本,则返回一个结果数组,否则返回 null

除了数组元素和length属性之外,exec()方法返回对象还包括两个属性。

  • index 属性声明的是匹配文本的第一个字符的位置
  • input 属性则存放的是被检索的字符串string

全局调用

非全局调用

2.4----String.prototype.search(reg)

search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串

search() 方法不执行全局匹配,它将忽略标志g,它同时忽略正则表达式对象的lastIndex属性,并且总是从字符串的开始进行检索,这意味着它总是返回字符串的第一个匹配的位置

2.5----String.prototype.match(reg)

match()方法将检索字符串,以找到一个或多个与regexp匹配的文本。但regexp是否具有标志 g对结果影响很大。

全局调用

非全局调用

2.6----String.prototype.replace(reg, replaceStr)

复习部分

  • 题目1: \d,\w,\s,a-zA-Z0-9,\b,.,*,+,?,x{3},^,$分别是什么?

    • \d: 代表范围为[0-9]的某个数字字符;
    • \w:代表范围为[a-zA-Z_0-9]的某个数字字符,字母字符或者数字下划线;
    • \s:代表范围为[\t\n\x0B\f\r]的某个空白符;
    • \b:代表了单词的边界;
    • . :[^\r\n] 除了回车符和换行符之外的所有字符;
    • * : 出现了零次或者多次(任意次);
    • +: 出现一次或多次(至少出现一次);
    • ?:出现零次或一次(最多出现一次);
    • x{3}:x出现了3次
    • ^ : 以XXX开头;
    • $ :以XXX结尾;

  • 题目2: 写一个函数trim(str),去除字符串两边的空白字符

      function trim(str){
     return str.replace(/^\s+|\s$/,'');
    }
      var str = "\t hello world \n";
      var result = trim(str);
      console.log(str);
    

  • 题目3: 写一个函数isEmail(str),判断用户输入的是不是邮箱

    function isEmail(str){
          var reg = /^\w+@\w+\.[a-zA-Z]+$/;
          return reg.test(str);
      }
        newstr = isEmail('wuyanwen1993@gamil.com');
        console.log(newstr);
    

  • 题目4: 写一个函数isPhoneNum(str),判断用户输入的是不是手机号

    function isPhoneNum(demo) {
      //正则表达式设置以+86出现1次,之后以数字结束,数字出现10次
        var reg = /^(\+86)?1\d{10}$/;
        return reg.test(demo);
    }
      newstr = isPhoneNum('15242456789');
      console.log (newstr);
    

  • 题目5: 写一个函数isValidUsername(str),判断用户输入的是不是合法的用户名

(长度6-20个字符,只能包括字母、数字、下划线)

   function isValidUsername(str){
      var reg = /^\w{6,20}$/
      return reg.test(str)
  }
      var str = 'aabbcccvvddd';
      console.log(isValidUsername(str));

  • 题目6: 写一个函数isValidPassword(str), 判断用户输入的是不是合法密码(长度6-20个字符,只包括大写字母、小写字母、数字、下划线,且至少至少包括两种)

      function isValidPassword(str){
      //首先判断用户输入的字符串是不是在6-20个字符的范围内
      if(str.length >= 6 && str.length <=20){
          //定义一个变量来计数
          var count = 0;
          if(/[0-9]/.test(str)){
              count++;
          }
          if(/[a-z]/.test(str)){
              count++;
          }
          if(/[A-Z]/.test(str)){
              count++;
          }
          if(/_/.test(str)){
              count++;
          }
          if(count>2){
              //表明输入通过了验证
              alert('通过了验证');
              return true;
          }else{
              //表明输入未能通过验证
              alert('未能通过验证');
              return false;
          }
    
      }else{
          //如果用户输入的字符串不在限定的范围内,则函数直接返回false
          alert('输入字符串不在限定范围内');
          return false;
        }
    }
      var str = 'abc122__ABC';
      isValidPassword(str);
    
  • 题目7: 写一个正则表达式,得到如下字符串里所有的颜色

var reg =/#[0-9a-fA-F]{6}/g;
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee ";
console.log( subj.match(reg) ) ; // ['#121212', '#AA00ef']
  • 题目8: 下面代码输出什么? 为什么? 改写代码,让其输出[""hunger"", ""world""].

  • 返回一个数组,数组的元素为[""hunger" , hello "world""]

  • 首先要匹配一个'',所以首个''前面的字符串都排除;

  • 之后匹配一个除了换行符和回车符之外的任何一个字符,由于在点号后面加了*这个通配符,表示可0次或多次(任意次),所以一直持续到了字符串的末尾前的''

  • 最后匹配'';

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

推荐阅读更多精彩内容