zoukankan      html  css  js  c++  java
  • 正则表达式 及 字符串处理

    1、正则表达式

    2、字符串


    正则表达式 

    一、正则表达式教程:https://www.w3cschool.cn/zhengzebiaodashi/regexp-metachar.html  或  https://www.imooc.com/learn/706 (推荐,慕课网讲解的比较好)

    二、图形化 (可视化) 正则表达式 编辑 工具:https://regexper.com/ (推荐,可以配置在本地的) 或  https://jex.im/regulex (不是很明确) 或  https://www.iteye.com/news/29859 (涉及 五款 这种工具)

    三、正则表达式手册:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html  

      正则表达式中的()类似于算数运算中的(),里面运算后的结果和后面运算。

    四、在线正则表达式测试  : http://tool.oschina.net/regex/     (这个了,里面忽略了m修饰符)               

                   http://tools.jb51.net/tools/regex.asp  (里面测试不正确,这个正则表达式测试包括3个修饰符,还有明确的匹配方法)

                      exec()方法是正则表达式的方法,eg:  patt.exec("The best things in life are free")

                      match()是字符串的方法,eg:   str.match(/ain/g)   

     

    五、正则表达式 讲解 (慕课网听课笔记)

    1、正则表达式由两种基本字符类型组成:
      a、原义文本字符
      b、元字符

    2、字符类:   [ ]             (类匹配的是一个字符
      匹配里面的任意一个字符(不是字符串),如:[abc], a、b、c是独立的,不是一个字符串

    3、反向字符类: [^ ]         某一类中取相反的。

    4、范围类:[a-z]
      如果范围类中要匹配 - ,只要-字符放在范围类外面就可以 如:[a-z-]

    5、预定义类: 使用一种预定好的字符,代表某一种字符类。如:d 表示 [0-g]的类

    字符 等价类 含义
    . [^ ] 除了回车符和换行符之外的所有字符
    d [0-9] 数字字符
    D [^0-9] 非数字字符
    s [ x0Bf ] 空白字符
    S [^ x0Bf ] 非空白符
    w [a-zA-Z_0-9] 单词字符(字符、数字下划线)
    W [^a-zA-Z_0-9] 非单词字符

    6、边界: (边界不包含字符,但是它描述后面或前面字符的边界所在)

    ^ 以xxx开始
    $ 以xxx结束
     单词边界
    B 非单词边界

    7、m修饰符:

      没有m修饰符,多行字符串,只有一个^和一个$边界。
      有m修饰符,多行匹配,每一行都有一个^和$边界

    8、量词:(就是多少次,如果没有量词,则匹配一个连续多个相同的字符的话,就必须使用字符类不断的叠加,如:dddddddd)

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

    9、js正则贪婪模式与贪婪模式(默认是贪婪模式):这个是决定 匹配 到哪个长度为止     https://www.cnblogs.com/rambo-yi/p/10035652.html

      在量词后 加上?就可以设置成非贪婪模式

    比如说匹配输入串A: 101000000000100       
    匹配 两个1之间的字符串:
    贪婪匹配【默认的】表达式: 1.*1     ===>  匹配到 1010000000001
    非贪婪匹配 表达式 :     1.*?1     ===>  匹配到 101

    10、分组: 用()表示        https://www.cnblogs.com/wancheng7/p/8906015.html

      说明: 就是以字符串为一个整体,而不是前面的字符类,主要是解决量词作用在一组字符串上而不是前面的一个字符类中

    10.1、分组的 捕获(默认是捕获模式):这个是分组中一个比较实用的概念。         https://blog.csdn.net/lihefei_coder/article/details/53022253 

      如果不想捕获某个分组,在括号里加 ?:,如 (?:abc)

      实例: 分组捕获可以使用变量来代替分组的内容。参考 https://www.imooc.com/video/12534
      如:实现下面的转化 2015-12-25 => 12/25/2015 (前后顺序是不一样的);  url获取参数也用到分组的捕获
    10.2、非捕获型 :(不希望捕获某些分组,在分组内加上?:就可以了)
    10.3、分组的 前瞻:     参考 https://blog.csdn.net/lihefei_coder/article/details/53022253

      正向前瞻(?=表达式)表示后面要有什么;

      反向前瞻(?!=表达式)表示后面不能有什么

    正向前瞻 exp(?=assert)
    负向前瞻 exp(!assert)

    11、或:(一般都是在分组中,不在分组中就把整个正则表达式 进行 或操作了)

    15、正则表达式 属性(即3个修饰符): 

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

      ignore case:是否大小写敏感,默认false

      multiline:多行搜索,默认false

      lastIndex:不常用

      source:不常用

    六、正则表达式 项目中的使用:

    1、获取url上的参数:(参数需要解码的话,都是先获取参数值,在对其使用 decodeURIComponent 解码)

      a、https://www.baidu.com/?testid=787dfdfd87&city=beijign (没有#号,或#号在后面。)

       关键点:location.search 属性可以获取 url上与路径相接的第一个 ?号(含 ?号) 到 #号之间的字符串(没有#号 一直到结束,#号后面的?使用location.search是获取不到的);

             str.match(reg) 方法,reg非全局时,匹配到数据,返回一个数组,数组中会包含reg 分组中匹配到的字符串,如:"test=787d7&city=bein/".match(/(^|&)test=([^&]*)(&|$)/),返回来的数组,会含正则中(^|&)、([^&]*)、(&|$)/) 这三个分组匹配的字符串。

    var str = location.search.substr(1) // 截取到 参数开头的字符串
    str.match(/(^|&)testid=([^&]*)(&|$)/)[2] // 直接获取到第二个分组([^&]*)的字符串,即我们需要的字符串   最后获取到的字符串需要考虑下需不需要编码

      b、https://www.baidu.com/#/index?testid=787dfdfd87&city=beijign ( #号好在 ?号的前面)                     参考:https://www.cnblogs.com/wenjunwei/p/9698379.html

        关键点:location.hash  属性可以获取url上 #号后面的所有字符串;

    var str = location.hash.split("?")[1]   // 截取到 参数开头的字符串
    str.match(/(^|&)testid=([^&]*)(&|$)/)[2]  // 这里和上面是一样的 ,  需要解码的话,使用 decodeURIComponent

      c、https://www.baidu.com/?testid=787dfdfd87&city=beijign/#/index?age=78 ( #号在两个问号之间)

        说明:这种情况一般是微信公众号网页会出现这种情况。vue开发的带#号单页面 放在微信公众号中,微信给的认证参数是放在#号前面的,而我们自己的参数一般是在url 后面,即#的后面。

            如:https://test.iconntech.com/prize-front/?code=011RxtQa0IfdBy1M01Pa09McQa0RxtQe&state=STATE#/index?actId=363     这里code参数是微信平台 给的参数,actId是 自己的服务器配置的。

        关键点:实际项目中 我们需要的参数 在 # 的哪一边是 ,肯定是知道,且一个项目中肯定是固定的。可以根据具体情况使用上面的其中一种方法 获取到相应的参数。

            如果不知道 大不了通过 location.search 和 location.hash 两端都去匹配就可以了(两段字符串 分别使用上面的方法处理)。

     

     

     
  • 相关阅读:
    IBatisNet不常用到的配置(Dao.config ConnectionTimeout),居然不起作用(前辈留给我们的坑)
    随机数 字母 数字
    证书文件(pfx)读取时报 “指定的网络密码不正确”
    SQL多结果集导出Excel
    Uva514
    PAT乙级1012
    栈-41
    位运算-89
    PAT乙级1028
    PAT乙级1029
  • 原文地址:https://www.cnblogs.com/wfblog/p/8953995.html
Copyright © 2011-2022 走看看