正则表达式 初探

来源:互联网 发布:淘宝默认几天自动付款 编辑:程序博客网 时间:2024/05/22 08:09

正则表达式 初探

1.用途

为了完成毕业设计,希望从大量文本中查找到有效数据写入表格并避免繁杂的人工操作,所以需要使用正则表达式进行一些自动化处理。

正则表达式(Regular Expression,简写为regex、regexp或RE)
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

2.学习书本和工具

学习书本使用的是 Wrox的《Beginning Regular Expressions》中文版,由清华大学出版社出版。
ISBN:978-7-302-18382-2
工具:Regex Match Tracer 2.1(windows环境)
下载地址(工具+书本测试例子)
https://yunpan.cn/cqFiIeVTjdrWa 访问密码 8c16

3.学习建议

推荐学习正则表达式30分钟入门教程
http://deerchao.net/tutorials/regex/regex.htm
看完以上教程以后再看书本,会有更深的理解。

4.个人学习小结

  1. 正则表达式为什么不好学?
    1. 没有同意的语法标准
      在不同的语言和不同的应用程序中使用正则表达式的语义会有所不同。
    2. 单个字符或者无字符,其使用环境不同,含义也会不同
      如^在字符类中表示否定,而在字符类外表示匹配一行或文本的开头
    3. 区分大小写
      1. 在大部分编程语言中,正则表达式默认区分大小写
      2. 元字符中特别需要区分大小写。\d 匹配数字 \D匹配非数字
  2. 编写易懂、易维护的正则表达式
    1. 说明正则表达式
      1. 说明问题定义
        1. 对于复杂的问题,最好能记录下你不想匹配的问题定义,一遍几个月后再看这些代码时,能对当初设计正则表达式模式时的需求有更清晰的回忆。
      2. 为代码添加注释
        //一下代码用Moon替换Star
        //以下代码一区分大小写的方式匹配Star,从而排除像start和star这样的单词
        //而且,只有当Star后跟一个空格符和字符序列Training时,
        //或者后跟一个句点字符时,
        //或作后跟一个问号时才会匹配
        1. 像这样的注释才能对正则表达式的作用,以及什么情况下会匹配正则表达式模式的组件给出更清晰的概念。
        2. 如果在解决问题的过程中,某种方法不适合,那么把这种方法为什么不适合放到注释中去也是非常有意义的。
      3. 利用扩展模式
        1. 扩展模式允许把注释放在相关模式组件的同一行中。这样有助于减少对代码的误解。也就是说可以把正则表达式分成好几行来写。但是如果使用的语言不支持扩展模式,这可以在正则表达式后面的注释分行写出各块正则表达式的含义
    2. 了解你的数据-以下内容将会说明数据中可能存在问题的细节
      1. 缩写词
      2. 固有名词
      3. 错误的拼写
    3. 创建测试用例
      1. 当模式不能够如期行事的时候,首先要分析下不想要的结果,看是否能迅速发现其行为不符合预期的原因所在。逐个分析表达式,如果失败,则重新创建一个问题定义,并投入更多的时间在理解数据源的基础完善问题上。
    4. 调试正则表达式
      1. 叛逆的空白符
        如果使用了扩展模式,那么正则表达式中的任何空白符都可以忽略不计。所以,要匹配空白符则必须使用元字符\s(它匹配任何空白符)来指定相应的空白符。
      2. 注意你的反斜杠
        $和$具有很大的差别
      3. 考虑其他原因
        可能出现的问题取决于代码想要实现的功能。切记正则表达式代码的问题是一个涉及到正则表达式模式、数据源和周边代码的复杂交互性问题。如果问题持续存在,就需要系统地检测每种可能性。
  3. 使用正则的分析方法
    1. 用自然语言来表达和说明你的意图。
    2. 考虑数据源及其可能的内容。
    3. 考虑可以使用的正则表达式选项。
    4. 考虑灵敏度和特殊性。(灵敏度:“正确的”除以“要找的” 特殊性:“正确的”除以“找到的”)
    5. 创建适当的正则表达式
    6. 对除了简单的正则表达式之外的正则表达式给予说明。
    7. 使用空白区域保持正则表达式说明的清晰。
    8. 测试正则表达式效果
  4. 小细节总结
    1. 慎用[A-z] 因为Z-a之间还有[、\、]、^、`
    2. 匹配中有“或”的时候,要遵循先“难”后“易”的原则 如:(2|2[1-9]) 在匹配23这个数据的时候,会优先匹配2这个数字而不会匹配23.所以改成(2[1-9]|2)
    3. 不建议使用反转字符类范围 如[z-a]
    4. 注意字符类中的连字符使用 如[.-/]有错(不希望选择.到/范围内的数字,而是希望匹配.、-、/三个字符)改为[-./]正确
    5. ^脱字符,位于[后面时,表示取反。若位于字符串开头则表示匹配一行或一个字符串的开始位置
    6. 在字符类中可以使用||和&&两个逻辑判断字符
    7. 某些语言支持POSIX字符类
    8. 原子的零宽断言 ^ 行开头,$行结尾,\< 词开头,>词结尾,\b 匹配词边界,可前可后
    9. 圆括号-注意不能包含空白符(会将空白符作为字符序列的一部分来处理)
    10. 错误的交替行为
      1. (a|ab) 较短的字符在前,较长的字符在后并且长字符包含断字符,则此时会产生歧义。应该用(ab|a)来匹配
    11. 嵌套的圆括号分组顺序
      1. 从外到内 从左到右 优先级:高-》低
      2. 反向引用
        1. ([A-Za-z]+) +\1> => paris in the the spring
        2. \1表示反向引用$1(即此时\1就是\$1)
    12. 先前匹配
      61. 根据要匹配的字符串后面是否存在一个特定的字符序列(肯定式先前查找)或是不存在一个特定的字符序列(否定式向前查找)来决定是否匹配(即一个子模式要进行匹配,但不返回结果)
    13. 匹配位置-使用两次 ”查找“
      1. 例.(?<=is )(?=Andrew) 匹配到This is Andrews book.第八个位置
    14. 最大化灵敏度
      1. 列举想匹配的字符串
      2. 列举不想匹配的字符串
  5. 常用元字符汇总
    这里写图片描述
0 0
原创粉丝点击