正则表达式-学习笔记

129 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

1.正则表达式 regular expression

-用于查找 含有 匹配字符串(判断完全相等) 和 匹配元字符(通配符) 的字符串

------>你要找什么,从哪找,你要找多少<------

2.正则表达式对象

-由正则表达式创建的对象

-该对象可以进行 匹配,提取和替换

创建正则表达式对象

1)构造函数 (显式)

   var regex = new RegExp ( 正则表达式字符串 [, 匹配模式]);

2)字面量(隐式)

   var regex = /正则表达式/;


使用正则表达式进行匹配

            语法:   正则对象.test ( 字符串 ) -> bool类型

     如果参数字符串中含有 复合 正则匹配的  子字符串,  就返回true ,否则返回 false

   ---例如:查找一段文字中是否包含ashin

  1. var str = 'qqqqwertyioplkjashinmnbvcxz';
  2. //找ashin,则正则表达式可用'ashin'来表示
  3. //1.创建正则表达式对象
  4. var r1 = new RegExp( ' ashin' );
  5. var r2 = /ashin/;
  6. //2.检查匹配
  7. var res = r2.test( str );
  8. console.log( res );

---传统字符串操作

  1. var str = 'qqqqwertyioplkjashinmnbvcxz';
  2. var search = 'ashin';
  3. for(var i =0;i<str.length-search.length;i++){
  4. //判断str[ i ] 开始 的字符串是 ashin
  5. if( search == str.substr( i,search.length) ){
  6.  console.log( i );
  7.  break;
  8. }
  9. }
3.基本元字符
        意义               用法
    .表示任一个非换行的字符(任意字符.无限制) foot         foo.
   (  )表示分组和提高优先级
  [  ]表示一个字符,出现在 [ ]中的字符[abc]  ,出现在 [ ] 中的任意一个字符,匹配 a , 或 b  或 c
 |  或允许使用多个字符匹配 a|b|c   正则表达式|正则表达式,foot|food,foot|foodfoo( t|d)

转义字符 : \  

    表示点:   \ .

    表示 [  ]  : \ [   \ ]

    表示(   )  :  \ (   \ )

    表示 \    :  \ \

4.限定元字符(你要找多少)
     *紧跟前面的一个字符或一组字符出现 0 次到 多次表示:12333333 后面很多3正则: 1233*      --123  0次  --1233  1次  --12333  2次  -- 1233333331( 23 )*   表示   --1    0次   --123  1次    --12323    2次
     +紧跟在前面的字符出现 1 次到 多次123+ 
     ?紧跟在前面的字符出现 0 次或 1次查看一串字符串中是否含有http或https http://.+ | https://.+https?://.+
 { 数字 }  紧跟在前面的字符出现 指定次数       a{3}  aaa
{数字,} 紧跟在前面的字符 至少 出现指定次数  a{3,}    aaa,aaaaaa,aaaaaa
{数字,数字}  紧跟在前面的字符出现的次数范围      a{1,3}   a,aa,aaa
5.首尾正则表达式

^    表示必须以xx开头

       ^a   必须以 a开头的字符串

       a    表示一个字符串中只要含有 a 就可以匹配

      ^a^a    非法的写法, ^,若表示开头,必须写在开头,且只能写一个

$     表示  必须以 xxx 结尾

       a$        必须以 a 结尾

 ------案例

1> 身份证号:^[0123456789]{17}[0123456789x] $

2> 邮箱:^[0-9a-zA-Z]+@[0-9a-zA-Z]+(\ . [0-9a-zA-Z]+)+$

3> 匹配任意数字(考虑0和正负):^(-?[1-9] [0-9]*| 0 )$  

4>匹配指点范围的数字 0 -233 (考虑1位,2位和3位):

^ ( [0-9] | [1-9] [0-9] | 1[0-9] [0-9] | 2[ 0-2][0-9] | 23[0-3] ) $

5> 匹配小数(考虑正负):^( ( - ?[1-9][0-9]* | 0 )( \ .[0-9]*[1-9] ) )$

6>匹配小数和整数(考虑小数点后字符出现0次或1次): 

 ^( ( -? [1-9][0-9]* )( \ . [0-9] *[1-9] ) ? )$

6.简写元字符

   \s   空白字符,包括空格,tab 回车换行等

   \S    非空白字符

    js  中常常使用[ \s \S ] 表示任意字符

   \w   表示字符,包含字母,数字,下划线

   \W  非字符

   \d   数字

  \D   非数字  


匹配test      /^正则$/

提取exec    /正则/


7.提取 exec

    语法:   正则表达式对象.exec ( 字符串 )   ->封装成数组

  1. var str ='qwertyuiopashinlkjhgfdsa';
  2. var r =/ashin/
  3. var res = r.exec('ashin');
  4. console.log(res);
8.循环提取

  将一个字符串中符合要求的字符串都提取出来

   1>正则表达式需要使用全局模式

   var  r = new RegExp ( '正则' , 'g' );          g -> global

   var  r = /正则/g;       

   2> 调用 exec 首先获得第一个匹配项

        反复调用获得所有匹配项

       若全部匹配完,还调用,则返回 null

  1. var str ='qwer123poiu456lkjhg789asdf'
  2. var r =/\d+/g;
  3.  //r.exec(str)     ->123
  4. //r.exec(str)     ->456
  5. // r.exec(str)     ->789
  6. // r.exec(str)     ->null
  7. var res;
  8. while(res=r.exec(str)){
  9. console.log(res);
  10. }
9.将匹配的结果进行解析   [提取内容步骤123  加括号(  )

 [注:正则表达式中,分组有编号,从左往右'('. 从1开始 ,匹配提取的结果中,对应的编号就可以获得分解的数据]

---解析邮件地址

  1. //将邮箱全部提取出,名字和主机名
  2. var str='我有一个邮箱, 是 itcast@itcast.cn, 还有 abc@126.com, 和 1234567@qq.com'
  3. //循环提取的正则表达式
  4. var r = /[a-zA-Z\d]+@[a-zA-Z\d]+(.[a-zA-Z\d]+)+/g;
  5. //再次分解 (加括号分组形式)
  6. var r = /([a-zA-Z\d]+)@([a-zA-Z\d]+(.[a-zA-Z\d]+)+)/g;
10.匹配但不去捕获的元字符

( ? :其他正则表达式内容 )

11.截取字符串中的一个 html 标签

    1>标签使用<> .So正则表达式写成 <\w+>

    2>与之匹配的标签名

      在正则表达式中国使用组匹配到某一个数据,允许在该正则表达式中使用'\数字'的方式引用该组 ( 一组标签名

)

     <(\w+)>.*<\ / \1>

  1. var str = '123<div>456</div>78<div>9</div>0<i></i>abc';
  2. var r = '/<(\w+).*(\ / \ 1)>/g';
  3. var res;
  4. while(res=r.exec(str)){
  5. console.log(res[0]);
  6. }
12.贪婪模式    (尽可能多的匹配)

      正则表达式中,涉及到次数限定,默认尽可能多的匹配

      取消贪婪模式,在次数限定符后加?

 注:贪婪模式性能高于非贪婪模式--

\d+\d+\d+

123

取消贪婪模式

\d+?\d+\d+

13.否定元字符

  语法: [ ^字符 ]

   非指定字符

[ ^abc ]  不是a,b,c

14.字符串的替换

* 语法:*

   字符串.replace( 查找字符串,替换字符串 ) -> 字符串

  * 1> 字符串替换方法*

       字符串1.replace( 字符串2, 字符串3 )

      在 字符串1 中找到 字符串2,将其替换成 字符串3 ,返回替换后的字符串

     特点:  只替换第一个找到的字符串

 "aaa".replace( 'a', 'A' )     ->  'Aaa'

   * 2>正则替换*

     字符串.replace( 正则表达式, 字符串 )  -> 字符串

        1.简单替换

         'aaaaa------bbbb----ccc'.replace( /-+/,'-')           -> aaaaa-bbbb----ccc

         'aaaaa------bbbb----ccc'.replace( /-+/g,'-')         ->aaaaa-bbbb-ccc

         2.分组替换    ( 使用  $数字  来引用替换的数据 )

      'abc123'.replace( /( \d+ )/,'d$1' )         ->' abcd123'

      '1999-1-11'.replace( / ( \d+ ) - ( \d+ ) -( \d+ ) / ),'11年2月$3日')      ->1993年10月24日

  * 3>函数参数用法*

       语法:

                     字符串.replace( 正则表达式, fn )

   邮箱:    / \w+@\w+( \ . \w+)+/g

'我的邮箱是:abc@itcast.cn, 你的邮箱是: defghijk@itcast.cn'.replace( /\w+@\w+(.\w+)+/g, '*' );

'我的邮箱是:abc@itcast.cn, 你的邮箱是: def@itcast.cn'

.replace( /(\w+)@(\w+(.\w+)+)/g, function ( s, g1, g2, g3 ) {

return '*';

} );

// 要求 只显示 第一个字符, 其余的都是用 * 表示

'我的邮箱是:abc@itcast.cn, 你的邮箱是: defghijklim@itcast.cn'

.replace( /(\w+)@(\w+(.\w+)+)/g, function ( s, g1, g2, g3 ) {

// 将用户名 变成 a***** 的形式

var first = g1.charAt( 0 );

var start = [];

for ( var i = 0; i < g1.length - 1; i++ ) {

start.push( '*' );

}

return first + start.join('') + '@' + g2;

} );