关于正则方法的一点理解

正则表达式
  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
   
 
时间: 2024-10-14 04:53:09

关于正则方法的一点理解的相关文章

convertView&amp;setTag方法的一点理解

前言 首先我们要知道setTag方法是干什么的,SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essentially an extra piece of information that can be associated with a view. They are most often used as a convenience to store data related to views in th

关于Character的digit,forDigit,getNumericValue方法的一点理解

Character类是一个包装类. char这种数据类型是基于原始的Unicode编码的,储存一个char用16个bit,因此定义characters也是16位定长的实体集合. Unicode编码标准发生了变化,数量级从\uFFFF到了\u10FFFF 对Unicode标准中的所有字符,16位已经是不够的了,即一部分字符并不能通过char来表示了. 我们称\u0000 to \uFFFF的字符集合,也就是用一个char能够表示的字符的集合,为the Basic Multilingual Plan

关于web开发的一点理解

对于web开发上的一点理解 1 宏观上的一点理解 网页从请求第地址 到获得页面的过程:从客户端(浏览器)通过地址 从soket把请求报文封装发往服务端   服务端通过解析报文并处理报文最后把处理的结果 封装成响应报文 发送给客户端(浏览器)  ,客户端解析响应报文  把正文(html css  javascript)渲染成我们见到的页面. 这就是我们如何看到页面的过程 图解 2对于网页的开发的框架的一点理解 上面提到了网页处理的过程  中 服务端解析请求报文 处理请求报文的过程 就是网站开发的框

关于我对VXLAN的一点理解

我的一些朋友之前一直在谈论vxlan如何如何,今天我就自己对vxlan的一点理解,简单写写,希望对大家有所帮助. 1.为什么要引入vxlan? 1)在同一个数据中心我们一般通过VLAN对业务进行不同的网段划分,实现了对不同业务的网段分割,但是在双数据中心或多数据中心,两个数据中心都有同一个网段,要实现两个主机的互访,要实现在三层网络环境中打通二层网络,我们引入了vxlan技术. 2)通过VLAN对数据中心的业务进行不同的网段划分,但是随着数据中心的不断扩容,当VLAN ID超过4096时,VLA

线程的一点理解

一.线程起源 线程的产生基于通过共享公共的内存空间来交换数据可提高协作进程间的通信效率这一思想.线程是程序执行流的最小单元,是进程中的一个实体,一个标准的线程由线程ID.寄存器集合和堆栈组成.是被系统独立调度和分配的基本单位.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行.由于线程之间的相互制约,致使线程在运行中呈现出间断性. 在某一时刻,进程内只有一个称为

我对直接插入排序的一点理解

今天复习排序,发现自己还是没什么长进,不过对于直接插入排序,还是有更深入的一点理解,这里留下点痕迹. 插入排序分为3类,即直接插入排序.二分排序以及希尔排序. 这里简单描述一下直接插入排序的思路.假如你现在是一名新生,早上全学院的学生去文体馆前集合,一个专业一列总队,而你去晚了,不知道自己该站哪,于是需要把自己插入到一个队列中去,这里模拟一下大脑的思路.因为你去晚了,所以你的同学都已经按照高矮顺序站好了,你从队尾开始比较,假如他比你低,ok,没他啥事了,如果他比你高,那他就得往后退,给你留下你站

Android measure和layout的一点理解

首先,推荐文章,http://blog.csdn.net/hqdoremi/article/details/9980481,http://www.docin.com/p-571954086.html 我理解measure的作用有2个:一个就是调用子view的measure函数,生成他们的高度和宽度,以便在自己的layout阶段参考:另一个是为父view提供关于自己的测量的width和height(这个宽度和高度往往和子view的测量高度和宽度有关),以便父view在layout阶段参考. lay

关于进程的一点理解

一.什么是进程? 进程包含存储在文件中的一组指令,该文件被读入内存并执行.正在执行的每个唯一的实例被称为进程,并且给它唯一一个标识,成为进程ID,它由操作系统确定.比如你在电脑中同时打开两个QQ,那么这两个程序就叫做进程,而且有两个不同的ID号. 二.进程如何创建? 被称为子进程的新进程由父进程的已存在的进程通过调用fork函数创建. pid=fork();//fork函数回传给pid的值是新进程的ID,数据类型为pid_t,属于int型. 子进程被创建为父进程的一个副本. fork函数在成功时

Java GC机制和对象Finalize方法的一点总结

GC是什么? 为什么要有GC? GC是垃圾收集的意思(Garbage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的. 有向图垃圾回收机制 .NET的垃圾回收采用引用计数,java的垃圾回收机制采取的是有向图的方式来实现,具体的说,java程序中的每个线程对象就可以看作是一个有向图的起点,有向边从栈中的引用者指向堆中的引用对象.在这个有向图中,如果