码迷,mamicode.com
首页 > 其他好文 > 详细

关于正则方法的一点理解

时间:2017-04-04 23:14:41      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:难题   转换   ...   system   单个字符   多次   reg   body   函数   

正则表达式
  1、 元字符
  元字符是正则表达式的基础,比如\d--[0-9]数字字符,\D--[^0-9]非数字字符;还有转义符\f--换页,\n--换行;边界^--字符串起始位置,$--字符串结束位置,量词*--重复零次或更多 x>=0,+--重复一次或更多次 x>=1,?--重复零次或一次 x=(0||1)
  {n}n次x=n,{n,} 重复n次或更多 x>=n,{n,m} 重复出现的次数比n多但比m少 n<=x<=m
   
  2、正则方法
  -> test
  语法: <regexp>.test( string ) -> boolean
  判断这个字符串是否符合这个正则表达式
  常用与验证
  -> exec
  语法: <regexp>.exec( string ) -> Array
  将匹配到的提取出来.
  1> 单个字符串提取
  /e/.exec( ‘abcdefg‘ ) -> [ ‘e‘ ]
  /h/.exec( ‘abcdefg‘ ) -> null
  2> 提取并解析( 常用 )
  分组: 在 正则表达式中使用 () 可以将匹配的结果进行分组.
  学会分组的编号.
  1) 从左往右数 左圆括号 (
  2) 依次从 1 开始给 圆括号编号
  123 4 5 6
  /(((.)(.))(.)(.))/
  使用 exec 方法返回的是一个数组. 在匹配的结果中, 匹配到的字符串是数组的 第 0 个元素.
  其中的每一组对应于数组的每一项.
  var r = /(((.)(.))(.)(.))/;
  var str = ‘abcd‘;
  r.exec( str );
   
  // [ 0 ]: 匹配到的结果: ‘abcd‘
  // [ 1 ]: 匹配到的第1组: ‘abcd‘
  // [ 2 ]: 匹配到的第2组: ‘ab‘
  // [ 3 ]: 匹配到的第3组: ‘a‘
  // ...
  Array[7]={0: "abcd",1: "abcd",2: "ab",3: "a",4: "b",5: "c",6: "d"}
   
  对路径的解析:
  /.:.*\\.+\..+/
  例如: c:\windows\system32\1.mp3
  .代表任意字符(C盘) : 对应盘符冒号 .*0次或多次 尽量多的匹配(贪婪模式) 所以从后面开始看
  .+1次或多次 再往前\.转移字符.对应.mp3的"." 所以最后的.+对应mp3
  再往前.+ 1次或多次 再往前\\转移字符\ 对应\1.mp3的"\",所以 .+对应1
  最后中间的\windows\system32都属于.*
   
   
  // 贪婪模式, 所有 +, * 这类元字符都是尽可能多匹配
  /(.+)(.+)(.+)/
  /(.+)(.+)(.+)/.exec(‘abcdef‘)结果是
  Array[4]={0: "abcdef",1: "abcd",2: "e",3: "f"}
  /(.+)(.+)(.+)/.exec(‘abcdef‘)[1]----"abcd"
   
  // 取消贪婪使用 ?
  /(.+?)(.+)(.+)/
  /(.+?)(.+)(.+)/.exec(‘abcdef‘)结果是
  Array[4]={0: "abcdef",1: "a",2: "bcde",3: "f"}
  /(.+)(.+)(.+)/.exec(‘abcdef‘)[1]----"a"
   
   
  3> 循环提取所有
  ‘abcdefgedgedg‘ // 将其中所有的 e 取出来
  操作:
  1) 在正则表达式中启用全局模式: /..../g, new RegExp( ‘...‘, ‘g‘ )
  2) 调用一次 exec 方法, 获取一个匹配项
  3) 再次调用 exec 方法, 获得下一个匹配项
  4) 如此往复, 没有匹配项的是否返回 null, 再次调用 exec 则匹配返回第一个匹配项
   
  var m;
  while ( ( m = r.exec( str ) ) != null ) {
  // m 就是每一次匹配到的结果
  }
   
  -> replace
  找出匹配项替换掉
  a、简单的替换:
  ‘adCde‘.replace(/[A-Z]/g,-)------"ad-de"
  b、带回调函数的替换
  ‘abCdeFg‘.replace(/[A-Z]/g,function(str){return str.toLowerCase()})----"abcdefg"
  在这里也可以用分组的思想解决部分难题:比如将‘abc-def-ghi-jk‘转换为‘abcDefGhiJk‘;
  我们需要去掉‘-‘还需要将之后的第一个字母变为大写;那我们可以这样
  ‘abc-def-ghi-jk‘.replace(/-(.)/g,function(_,num1){return num1.toUpperCase()})---"abcDefGhiJk"
  这里参数和上面exec方法中的分组一样,"_"代表匹配的结果(由于不需要所有给_),num1代表匹配到第一组,而且里面只有一个组(.)横线后的任意字母,返回值将字母转换为大写即可;
  再看看,如果同样的字符串我们需要把横线后第二个字母改为下划线"_",我们可以这样
  ‘abc-def-ghi-jk‘.replace(/(-.)(.)/g,‘$1_‘)----"abc-d_f-g_i-j_"
  在这里有需要注意的"$1"表示匹配到的第一个组,"$2"表示匹配到的第二个组;
   https://github.com/zxx2011509281/RegExp-.git
   
 

关于正则方法的一点理解

标签:难题   转换   ...   system   单个字符   多次   reg   body   函数   

原文地址:http://www.cnblogs.com/H5C3JS/p/6666639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!