zoukankan      html  css  js  c++  java
  • 精通正则表达式(第三版)—Mastering Regular Expressions,3rd Edition—读书笔记2

    1.肯定断言:必须匹配一个字符

      排除型字符组:匹配未列出字符的字符组

    2.范围表示法——列出范围内所有的字符 大多数情况下,不会影响执行速度。但是,某些实现方式不能完全优化字符组。所以,最好是有范围表示法,有可能速度更快。 [a-Z],可能存在遗漏;[a-zA-Z],可以匹配所有字母。

    3.点号:在某些软件中,可以匹配任何字符;在其他软件中,匹配处理换行符之外的任何字符。 .* :通常情况下,不能匹配换行符; [^"]* :替代

    4.字符组减法:在字符组中进行减法运算,.NET提供 [a-a]-[aeiou]:[a-z]能够匹配字符的减去[aeiou]能够匹配的字符

    5.锚点、"零长短断言":不会匹配实际的文本,而是寻找文本中的位置

    6.环视:大多实现方式,都限制了逆序环视中的表达式的长度,但是顺序环视则没有限制。有些软件支持逆序环视匹配任意长度的文本,但是可能带来严重的效率问题 逆序环视:只能匹配固定长度的文本。

      ?<!w :ok ; ?<!this|that :ok; ?<!books? :wrong,匹配文本不确定,改为 (?<!book)(?<!books) :ok;

      ?<^w+: :wrong;匹配文本不确定

    7、命名捕获:为捕获的内容命名 (?ddd)- (?ddd)- (?dddd) : 可以通过 RegexObj.Groups["Area"]来访问括号捕获的内容,

    8、某些时候正则表达式处理各种极端情形会降低收益/成本的比例。

        某些情况下,更适合的做法就是不依赖正则表达式完成全部的工作。用括号将每个字段括起来$1、$2、$3用其他程序验证。

        正则表达式不总是最优解,多数程序设计语言都提供了处理文件名的费正则表达式函数。

    9、设置锚点,可以提高正则效率。

    10、嵌套:正则表达式无法匹配任意深度的嵌套结构。但可以匹配特定深度的嵌套括号,不是任意深度的嵌套括号   [^()*(([^()]*)[^()]*)]  可以匹配  val=foo(bar(this),3.7)+2*(that-1);

    11、注意,没有匹配任何必须元素,导致任何字符都可以匹配成功   -?[0-9]*.?[0-9]*

    12、占有优先量词或固化分组,可以禁止引擎回溯到可能出问题的地方。

    ip地址正则匹配:^([01]?dd?|2[0-4]d|25[0-5].)([01]?dd?|2[0-4]d|25[0-5].){2}([01]?dd?|2[0-4]d|25[0-5]$)  

                          注意 dd? 比d?d 效率更高

    所在路径和文件名:^(.*)/[^/]*$  优于  ^(.*)/(.*)$  更加明确的表达了意图。提醒8.

    匹配引号内的字符: "(\.|[^\"])*"   或"(?>(\.|[^"])*")   或"(\.|[^"]*+")        \.  :可以包括转义字符    ;    固化分组、占有优先量词:可以禁止引擎回溯到可能出问题的地方

  • 相关阅读:
    完成端口CreateIoCompletionPort编写高性能的网络模型程序
    offsetof的使用
    __attribute__
    nn_slow和nn_fast
    完成端口(Completion Port)详解(转)
    等待
    win8.1磁盘使用率100解决方法
    ubuntu 14.04 修改PS1提示符
    ubuntu14.04 开启root登陆
    Linux下彻底卸载LibreOffice方法
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/5498005.html
Copyright © 2011-2022 走看看