• 组内正则培训记录


     

    0. 注: 不同语言中的正则表达式实现都会有一些不同。下文中的代码示例除特别说明的外,都是使用JS中的正则。

    1. 正则表达式关键字

    ( ) [ ] { } . * ^ $ + ?

      

    2. 正则表达式最常用语法

    PS: pattern表示一个正则表达式

    字符

    说明

    转义符

    ^

    表示非,或匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“ ”或“ ”之后的位置。

    $

    匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“ ”或“ ”之前的位置。

    {n}

    n 是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。

    {n,}

    n 是非负整数。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。“o{1,}”等效于“o+”。“o{0,}”等效于“o*”。

    {n,m}

    M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,“o{1,3}”匹配“fooooood”中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。

    *

    零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。

    +

    一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。

    ?

    零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。

    .(小数点)

    匹配除“ ”之外的任何单个字符。若要匹配包括“ ”在内的任意字符,请使用诸如“[sS]”之类的模式。

    x|y

    匹配 x 或 y。例如,'z|food' 匹配“z”或“food”。'(z|f)ood' 匹配“zood”或“food”。

    [xyz]

    字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。

    [^xyz]

    反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”。

    [a-z]

    字符范围。匹配指定范围内的任何字符。例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母。

    d

    数字字符匹配。等效于 [0-9]。

    D

    非数字字符匹配。等效于 [^0-9]。

    换行符匹配。等效于 x0a 和 cJ。

    3. 捕获与不捕获

    (pattern)

    匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“(”或者“)”。

    (?:pattern)

    匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“or”字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。

    (?=pattern)

    执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配“Windows 2000”中的“Windows”,但不匹配“Windows 3.1”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

    (?!pattern)

    执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配“Windows 3.1”中的 “Windows”,但不匹配“Windows 2000”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

    在各种编程语言中,可以捕获匹配到的字符串,如在Js中可以用RegExp.$N,N>=1,来获取匹配的字符串。如果使用了不捕获模式,则即使正确匹配也不会捕获匹配结果。

    其中后面3个都是不捕获匹配。

    上述表达式中还包含正向预匹配和反向预匹配,需要注意的是,IDE的查找、替换功能中貌似不能使用, 但以上几个功能在JS和C#中都已经实现,可以使用。

    4. 贪婪与非贪婪匹配模式

    正则表达式匹配时,默认是使用贪婪模式。如果在修饰匹配次数的符号后加一个问号(?),则表示使用非贪婪模式。顾名思义,贪婪模式会匹配尽量多的字符,非贪婪模式会在一匹配到所需字符就停止匹配。

    如下表达式为贪婪模式:

    var reg = /([a-z]+)/;

    如下表达式为非贪婪模式:

    var reg1 = /([a-z]+?)/;

    当上述两个正则表达式匹配一下字符串后:

    var str = "abcdefg";

    reg.test(str); console.log(RegExp.$1);

    reg1.test(str); console.log(RegExp.$1);

    捕获到的结果分别是:

    贪婪模式:

    "abcdefg"

    非贪婪模式:

    "a"

    5. 正则表达式匹配模式

    a)         只匹配一次, 正则的默认匹配模式, 在输入字符串中匹配成功一次就停止匹配。

    b)         全局模式,   在输入字符串中遍历,找出所有正确匹配的字符串

    c)         忽略大小写, 正则默认会区分大小写进行匹配,可开启忽略大小写匹配。

    d)         单行模式,   正则的默认匹配模式,如果输入的文本包含 等换行符时,正则的关键字$会匹配字符串结束为止。

    e)         多行模式,   MultiLine模式,开启后,关键字^和$可以匹配每行的开始和结束,每行的开始结束根据换行符( )决定。

    6. 正则表达式语法参考网址

    http://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.80).aspx

    http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F

    http://zend.jz123.cn/9.htm

    7. 正则使用场景

    a)         编程语言:

                             i.              JAVASCRIPT:

    可以用/abc/g或new RegExp(“abc”,”g”)来声明正则表达式

    其中第一种写法,在后面一个斜杠(/)添加字符来指定匹配模式,第二种写法,在第二个参数中添加字符来指定匹配模式。 各字符对应的匹配模式如下:

    g : 全局模式

    I: 忽略大小写

    m: 多行模式

    其中“区分大小写”、“只匹配一次”与“单行模式”为JS正则的默认模式,若要使用,只需要不设置忽略大小写、全局模式或多行模式即可。

    如果需要同时启用全局、忽略大小写和多行模式,可以用如下写法:

    /abc/gim

    new RegExp(“abc”,”gim”);

    其中”g”、”I”、”m”的顺序没有影响。

                           ii.              C#:

    需要引用System.Text.RegularExpressions命名空间,使用

    b)         IDE

                             i.              Visual Studio

                           ii.              SQL Server

                          iii.              Vim、Emacs、Sublime Text等等

    7.1 JS

    在JS中声明正则表达式有2种方式

    var reg = /.*/;

    var reg = new RegExp(“.*”);

    JS的正则默认为只匹配一次。

    要获取上一次正则匹配捕获到的结果,可以用RegExp.$N, N为大于等于1的正整数,按顺序表示匹配到的结果。

    7.2 C#

    在C#中使用,正则,需要引用System.Text.RegularExpressions;。

    创建正则的代码如下:

    Regex reg = new Regex("Windows (?!95|98|NT|2000)");

    C#的正则默认为全局模式。

    new Regex方法有3个重载, 第二个参数是一个枚举,可以指定匹配模式,这里包含多个模式,常用的有IgnoreCase(忽略大小写),Multiline(多行模式),其中有Singleline,(单行模式)不需要指定,默认就是单行模式

    8. IDE(Visual Studio、SQL Server)

    如上文所述, 微软的IDE中暂不支持预匹配功能。

    在Visual 2010或以下,和SQL SERVER中要使用正则表达式进行查找或替换,只需要勾选窗口中底部的“使用”复选框并选择"正则表达式"即可.

    在Visual 2012或以上,要要使用正则,只需要开启查找、替换功能中的“*.”的选项即可。

      

    在微软的IDE中(VS和SQL SERVER),在替换功能中,要使用匹配并捕获到的字符串,不是使用$1,而是使用N, N为大于等于0的整数。

    如我在IDE中输入:

    Abcd

                       使用正则:

                                ^.*$

                       我需要把原本内容替换为Abcde,只需要在替换为栏中输入e即可

      

    9. 正则表达式性能

    这个课题比较难准备,一来是我也只知道点皮毛,二来项目需求不大,三来准备需要时间较长,所以留给大家自己需要的时候去了解吧。 影响正则表达式性能的一个关键字是:“回溯”, 大家可以从这上面开始。

  • 相关阅读:
    R--相关分布函数、统计函数的使用
    Spark Streaming
    统计与分布的相关知识
    Python--WebDriverWait+expected_conditions的一个应用
    Python+Selenium与Chrome如何进行完美结合
    Python+Selenium+Chrome 的一个案例
    python -使用Requests库完成Post表单操作
    JetBrains PyCharm 2018.2.4 x64 工具里如何安装bs4
    用JetBrains PyCharm 开发工具写一个简单python案例
    dom4j学习总结(一)
  • 原文地址:https://www.cnblogs.com/jayruan/p/5428184.html
Copyright © 2020-2023  润新知