正则表达式

来源:互联网 发布:重庆悦来数据谷 编辑:程序博客网 时间:2024/06/18 14:49

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 | food

foo( t | d) 

转义字符 : \  

    表示点:   \ .

    表示 [  ]  : \ [   \ ]

    表示(   )  :  \ (   \ )

    表示 \    :  \ \


4.限定元字符(你要找多少)

     *

紧跟前面的一个字符或一组字符出现 0 次到 多

表示:12333333 后面很多3

正则: 1233*      –123  0次  –1233  1次  –12333  2次  – 123333333

1( 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>与之匹配的标签名

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

     <(\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+ ) / ),’12月$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;

} );

           

      






1 0
原创粉丝点击