zoukankan      html  css  js  c++  java
  • 正则表达式用法简介与速查

      1. 基本元字符

    元字符说明举例说明
    . 匹配任意单个字符(换行符除外) c.t 匹配:所有c和t之间隔一个字符的文本,如:cat, cbt, cct, ...
    [] 匹配字符集合中的一个字符 [abc] 匹配:a或b或c
    [^] 对字符集合求非 [^abc] 匹配:“非a非b非c”的任意字符
    - 定义一个区间 [A-Z] 匹配:字母A,B,C,...,Z中的任意一个字符
    对下一个字符转义 需要转义的字符: . [ ] ^ - * ? + ! { } $ ( )

      2. 特殊元字符

    元字符说明补充说明
    d 匹配任意一个数字字符 等价于[0-9]
    D d 的反义,匹配一个任意非数字字符 等价于[^0-9]
    w 匹配任意一个“字母数字下划线”字符 等价于[A-Za-z0-9_]    (最新的实现中可匹配一个汉字)
    W w 的反义,匹配任意一个“非字母非数字非下划线”字符 等价于[^A-Za-z0-9_]
    f 匹配一个换页符 (属于空白字符)
    匹配一个换行符 (属于空白字符)
    匹配一个回车符 (属于空白字符)
    匹配一个制表符 (属于空白字符)
    v 匹配一个垂直制表符 (属于空白字符)
    [] 匹配一个退格字符 不常用(属于空白字符)
    s 匹配一个空白字符 包括上面的:f, , , , v, 注意:不包括[]
    S s 的反义,匹配任意一个非空白字符, 非 f, , , , v, 的任意字符
    cx 匹配一个控制字符 不常用,x为一个字母,用来表示特定的控制符。如:cM 匹配 Control-M或回车符
    xn 用一个ASCII字符的十六进制值去匹配这个ASCII字符 不常用,n为十六进制数表示
    n 用一个ASCII字符的八进制值去匹配这个ASCII字符 不常用,n为八进制数表示

      3. 次数元字符

    元字符说明举例说明
    * 匹配前一个字符(或子表达式)的 0 次或 多次重复 cat* 匹配:ca, cat, catt, cattt, ...
    + 匹配前一个字符(或子表达式)的 1 次或 多次重复 cat+ 匹配:cat, catt, cattt, ...
    ? 匹配前一个字符(或子表达式)的 0 次或 1 次重复 cat? 匹配:ca, cat
    {n} 匹配前一个字符(或子表达式)的 n 次重复 cat{3} 匹配:cattttt
    {n, } 匹配前一个字符(或子表达式)的至少 n 次重复 cat{3,} 匹配:cattt, catttt, cattttttt, ...
    {n, m} 匹配前一个字符(或子表达式)的 至少 n 次且至多 m 次重复 cat{3,5} 匹配:cattt, catttt, cattttt
    *? * 的懒惰版本 cat*? 懒惰匹配:t 的 0 次或 多次重复
    +? + 的懒惰版本 cat+? 懒惰匹配:t 的 1 次或 多次重复
    {n, }? {n, } 的懒惰版本 cat{3,} 懒惰匹配:t 的至少 3 次重复

      4. 位置元字符

    元字符说明补充说明
     匹配单词的边界  的判断依据是:位置两边分别为 w 和 W
    B  的反义,匹配非边界 B 的判断依据是:位置两边同为 w 或同为 W
    < 匹配单词的开头 (扩展的正则表达式,egrep支持)
    > 匹配单词的结束 (扩展的正则表达式,egrep支持)
    ^ 匹配字符串的开头 一般将整段文本视为一个字符串,可以和分行匹配模式组合使用
    $ 匹配字符串的结尾 一般将整段文本视为一个字符串,可以和分行匹配模式组合使用
    A 匹配字符串的开头 同 ^,但不受分行匹配影响
    z 匹配字符串的结尾 同 $,但不受分行匹配影响
    (?m) 分行匹配模式 (很多正则表达式实现不支持)

      5. 子表达式与回溯

    元字符说明补充说明
    () 定义一个子表达式 子表达式在一些文档中有时也称为 pattern(模式)
    | 逻辑或操作 一般用在子表达式内,如:(ab|cd) 表示匹配 ab 或 cd
    1 匹配第1个子表达式 1 表示左起第1个子表达式,2 表示第2个子表达式,依此类推
    ?(n) 条件回溯(if then) 如果第n个子表达式中的内容存在,则匹配判断条件之后的内容
    ?(n)| 条件回溯(if then else) 类似上面,then 要执行的内容与 else 要执行的内容之间,用 | 隔开。

      6. 前后查找

    元字符说明举例说明
    (?=) 向前查找(原字符串中,真正匹配内容在前面,条件在后面) d+(?=a) 匹配:以 a 结尾的数字,但 a 本身不在返回文字中
    (?<=) 向后查找(原字符串中,真正匹配内容在后面,条件在前面) (?<=a)d+ 匹配:以 a 开头的数字,但 a 本身不在返回文字中
    (?!) 负向前查找(将向前查找的“=”换成“!”) 向前查找的否定形式,d+(?!a) 匹配:不以 a 结尾的数字,
    (?<!) 负向后查找(将向后查找的“=”换成“!”) 向后查找的否定形式,(?<!a)d+ 匹配:不以 a 开头的数字,

      7. 常用正则表达式示例

    IP地址 (((d{1,2})|(1d{1,2})|(2[0-4]d)|(25[0-5])).){3} ((d{1,2})|(1d{1,2})|(2[0-4]d)|(25[0-5]))
    Email地址 (w+.)*w+@(w+.)+[A-Za-z]+
    URL地址 https?://[-w.]+(:d+)?(/([w/_.]*)?)?
    HTML注释 <!-{2,}.*?-{2,}>
    Js注释 //.*
    验证整数 ^-?d+$
    验证非负整数 ^d+$
    验证正整数 ^+?[1-9]d*$ 
    验证浮点数 ^(-?d+)(.d+)?$ 
    匹配unicode汉字 [u4e00-u9fa5]  (不包括中文标点符号)

      8. Python 中使用正则表达式的方法及示例

    点击标题,跳转到下文详细说明。

      9. JavaScript 中使用正则表达式的方法及示例

    点击标题,跳转到下文详细说明。

    1. 基本元字符用法简单说明

    (1) 匹配单个字符

    示例文本

    sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

    正则表达式

    sales.

    匹配结果

    sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

    解释:

    匹配以“sales”开头,后跟任意一个字符的6字符组合。

    (2) 使用转义字符

    示例文本

    sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

    正则表达式

    sales..xls

    匹配结果

    sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

    解释:

    匹配以“sales”开头,后跟任意一个字符,再后以“.xls”结尾的10字符组合。

    (3) 匹配字符中的某一个

    示例文本

    a1.txt, b1.txt, c1.txt, d1.txt

    正则表达式

    [ac]1

    匹配结果

    a1.txt, b1.txt, c1.txt, d1.txt

    解释:

    匹配以“a”或“c”开头,后跟字符“1”的2字符组合。

    (4) 特定字母可大小写

    示例文本

    The phrase is RegEx or regex, but not regEx.

    正则表达式

    [Rr]eg[Ee]x

    匹配结果

    The phrase is RegEx or regex, but not regEx

    解释:

    匹配 regex,其中第1个字符r大小写皆可,第4个字符e大小写皆可。

    (5) 定义区间匹配

    用法:

    [a-z]可匹配所有小写字母,[A-Z]可匹配所有大写字母,[0-9]可匹配所有数字。

    注意:如果要匹配所有大小写字母,要写成:[A-Za-z],而不能写成:[A-z](因为其中会包含一些 ASCII符号)。

    示例文本

    a1.txt, b1.txt c2.txt, d3d.txt, ee.txt

    正则表达式

    [a-z][0-9].txt

    匹配结果

    a1.txt, b1.txt, c2.txt, d3d.txt, ee.txt

    解释:

    匹配:第1个字符为小写字母,第2个字符为数字,最后以“.txt”结尾。

    (6) 组合使用

    示例文本

    background-color="#A2A2A2"; color="#000000"

    正则表达式

    #[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]

    匹配结果

    background-color="#A2A2A2"; color="#000000"

    解释:

    对于十六进制数,每位的定义范围为0~9,A,B,C,D,E,F,在上面的正则表达式中使用[A-Fa-f0-9], 重复6次,即可得到一个6位的十六进制数的匹配。(在后面第3小节介绍完次数匹配后,本例有更为简洁的写法。)

    (7) 取非匹配

    示例文本

    a1.txt, b2.txt, C3.txt, cc.txt, dd.txt

    正则表达式

    [a-z][^0-9].txt

    匹配结果

    a1.txt, b2.txt, C3.txt, cc.txt, dd.txt

    解释:

    匹配:第1个字符为小写字母,第2个字符不是数字,最后以“.txt”结尾。

    2. 特殊元字符用法简单说明

    (1) 匹配换行

    说明:

    在Windows下,换行用 表示;在Linux下,换行仅用一个 表示。

    示例文本(Windows下文本)

    001, Tom,  Male
    002, Tina, Female
    
    003, Jack, Male

    正则表达式

    
    

    匹配结果

    001, Tom,  Male
    002, Tina, Female 
                      
    003, Jack, Male

    解释:

    匹配Windows下的2个换行,如果在Linux下,相同匹配的正则表达式可写成:

    (2) 匹配数字字符

    示例文本

    if(testArray[2] == 10) { ... }

    正则表达式

    testArray[d]

    匹配结果

    if(testArray[2] == 10) { ... }

    解释:

    对于数组外的方括号 “[” 和 “]”,要用转义字符,中间的 d 匹配单个数字字符。

    (3) 匹配ASCII字符的十六进制值

    示例文本

    ABCDEABC

    正则表达式

    x41

    匹配结果

    ABCDEABC

    解释:

    xn中的n表示ASCII字符的十六进制值,例如ASCII字符 “A” 的ASCII值写成十六进制为0x41, 则 x41 可匹配文本中的所有 “A” 字符。

    3. 次数元字符用法简单说明

    (1) 匹配 1 次或多次重复: +

    示例文本

    The 1st email is to tom@initcircuit.com.
    The 2nd email is to jane@cnblogs.com.
    The 3rd email is to tim.brown@initcircuit.com.cn.

    正则表达式

    w+@w+.w+

    匹配结果

    The 1st email is to tom@initcircuit.com.
    The 2nd email is to jane@cnblogs.com.
    The 3rd email is to tim.brown@initcircuit.com.cn.

    解释:

    w+ 可以有效匹配一个或多个字母数字下划线,所以能匹配出前两个email地址。 但在第3个匹配时有点问题,由于 w 不包括“.”号,所以第3个email地址的@前面和@后面都只匹配了一部分,解决方案见下条目。

    (2) 匹配 0 次或多次重复: *

    示例文本

    The 1st email is to tom@initcircuit.com.
    The 2nd email is to jane@cnblogs.com.
    The 3rd email is to tim.brown@initcircuit.com.cn.

    正则表达式

    w+[w.]*@[w.]+.w+

    匹配结果

    The 1st email is to tom@initcircuit.com.
    The 2nd email is to jane@cnblogs.com.
    The 3rd email is to tim.brown@initcircuit.com.cn.

    解释:

    可以把上面的正则表达式拆成5部分分别来看:w+   [w.]*    @    [w.]+   .w+

    第1部分的 w+ 表示必须以字母或数字开头,不能有“.”开头,这部分匹配上面的:tom, jane, tim。

    第2部分的 [w.]* 表示可以有0个或多个的“字母数字”或“.”号,这部分匹配上面的:.brown。

    第3部分的 @ 直接匹配文中的 @。先跳过第4部分,直接看第5部分。

    第5部分的 .w+ 表示先匹配一个“.”号,后面再跟1个或多个的字母数字,这部分匹配上面的:.com, .com, .cn。

    最后看第4部分的 [w.]+,表示可匹配一个或多个的字母数字或“.”号,这部分匹配上面的:initcircuit, cnblogs, initcircuit.com。

    (3) 匹配 0 次或 1 次 重复: ?

    示例文本

    The URL is http://www.initcircuit.com/, and  https://www.initcircuit.com/.

    正则表达式

    https?://[w./]+/

    匹配结果

    The URL is http://www.initcircuit.com/, and  https://www.initcircuit.com/.

    解释:

    正则表达式中的 s? 可匹配 s 的 0 次或 1 次出现。

    (4) 匹配重复的次数: {n}

    示例文本

    background-color="#A2A2A2"; color="#000000"

    正则表达式

    #[0-9A-Fa-f]{6}

    匹配结果

    background-color="#A2A2A2"; color="#000000"

    解释:

    匹配一个十六进制位的6次重复。

    (5) 匹配至少重复的次数: {n,}

    示例文本

    001: 123.01
    002: 52.48
    003: 1024.56

    正则表达式

    d+: d{3,}.d{2}

    匹配结果

    001: 123.01
    002: 52.48
    003: 1024.56

    解释:

    中间的 d{3,}. 匹配:点号前至少有3位数字, 这样就把大于100数字给匹配出来了。

    (6) 匹配重复次数的区间: {n,m}

    示例文本

    2018-01-01
    99/12/01
    3-3-3
    03-03-03

    正则表达式

    d{2,4}[-/]d{1,2}[-/]d{1,2}

    匹配结果

    2018-01-01
    99/12/01
    3-3-3
    03-03-03

    解释:

    本例用于匹配合法的日期,最前面的d{2,4}用于匹配年份, 用2位数或4位数表示年份都可以,中间的 [-/] 表示日期分隔符,“-”或“/”都可以匹配(其中“-”前用了转义符), 后面的 d{1,2} 表示月份,用1位或2位都可以匹配出来。(本例只是展示 {n,m} 的用法,匹配表达式写法并不完美, 后面有匹配日期更好的正则表达式的写法)

    (7) 防止过度匹配,懒惰型次数匹配符: *?,   +?,   {n,}?

    示例文本

    The html is <p>abc</p> and <p>def</p>.

    正则表达式

    <p>.*</p>

    匹配结果

    The html is <p>abc<p> and <p>def<p>.

    解释:

    由于正则表达式中间的.*可匹配任意字符的任意多次重复, 因此把本行的最前面1个<p>和最后的一个</p>中间的内容都一股脑儿地全都匹配了出来, 这不是我们想要的结果。可使用 * 的懒惰型版本 *? 来匹配,改进如下:

    正则表达式

    <p>.*?</p>

    匹配结果

    The html is <p>abc<p> and <p>def<p>.

    解释:

    懒惰型版本 *? 在匹配任意次数的重复的字符时,会时时注意其后面的表达式 </p>,如果一旦发现后面的表达式</p>符合匹配条件,自己本身就停止继续匹配了。所以在本例中, 只匹配到</p>之前的部分。

    4. 位置元字符用法简单说明

    (1) 匹配单词边界

    示例文本

    There is a car on the card.

    正则表达式

    car

    匹配结果

    There is a car on the card.

    解释:

    我们只想匹配 car,不想匹配后面的 card, 此时需要使用单词边界匹配 ,改进如下:

    正则表达式

    car

    匹配结果

    There is a car on the card.

    解释:

    单词边界匹配符  判断单词边界的依据是: 它的左右两边分别是一个 w 和 一个 W。注意:位置元字符  仅匹配位置,其本身并不匹配任何实际出现的字符。 在本例中,car 单词的开头处,其左边是一个空格(即W),右边是一个字母 c(即w),符合  的边界判断条件。car 单词的结尾也类似,car 单词结尾处,其左边是一个字母 r(即w),右边是一个空格(即W),亦符合  的边界判断条件, 故2个  的中间不分的 car 被匹配出来。

    (2) 匹配字符串开头与结尾

    示例文本

    something
    <html>
        blablabla
    </html>
    something else

    正则表达式

    <html>.*</html>

    匹配结果

    something
    <html>
        blablabla
    </html>
    something else

    解释:

    如果我们希望,整段文本只有当以<html>开头时才匹配, 若之前有其他内容则不匹配;同样,整段文本只有以</html>结尾时才匹配,之后若有其他内容则不匹配, 此时就需要用到 ^(字符串开头)和 $(字符串结尾)匹配符了。改进如下:

    正则表达式

    ^<html>.*</html>$

    匹配结果

    something
    <html>
        blablabla
    </html>
    something else

    解释:

    这样,上面的示例文本就不会有内容被匹配出来了。

    5. 子表达式与回溯用法简单说明

    (1) 子表达式

    说明:

    前面的“次数元字符”只能匹配1个字符的若干次重复, 如果我们要匹配一个字符串的若干次重复,就需要用到子表达式。

    示例文本

    The abcabc can match, but not the abc.

    正则表达式

    (abc){2}

    匹配结果

    The abcabc can match, but not the abc.

    解释:

    子表达式(abc)重复2次可以被匹配出来。

    (2) 匹配IP地址

    示例文本

    The IP address is 192.168.1.10.

    正则表达式

    (d{1,3}.){3}d{1,3}

    匹配结果

    The IP address is 192.168.1.10.

    解释:

    子表达式为(d{1,3}.),表示1~3位数字后跟一个“.”号, 可以匹配形如:“192.”或“1.”这样的字符模式。之后的 {3} 表示重复3次,即可以把“192.168.1.”匹配出来了。 最后的 d{1,3} 表示1~3位数字,可以把最后的“.10”匹配出来。当然,这个正则表达式并不完美, 会把超过255的不合理的IP地址也匹配出来,后面的“常用正则表达式示例”会有更好的解决方案。

    (3) 逻辑或的使用

    示例文本

    1111, 1920, 5279, 2099, 199

    正则表达式

    (19|20)d{2}

    匹配结果

    1111, 1920, 5279, 2099, 199

    解释:

    这里只匹配以19或20开始的年份,子表达式中使用了“|”号, 匹配19或20,后面的 d{2} 表示后面再跟2位数字。

    (4) 子表达式的嵌套

    说明:

    这里我们用子表达式的嵌套来解决前面的IP地址的合理性问题。 我们要找到255及以下的数字,有4种合理情况:(1) 1位或2位数字;(2) 以1开头的3位数字; (3) 以2开头的3位数字,十位为0~4的;(4) 以25开头的3位数字,个位为0~5的。

    示例文本

    192. 255. 10. 999. 

    正则表达式

    ((d{1,2})|(1d{1,2})|(2[0-4]d)|(25[0-5])).

    匹配结果

    192. 255. 10. 999.

    解释:

    这个嵌套的正则表达式看上去很复杂,其实拆开来看还是比较简单的:

    ( (d{1,2}) | (1d{1,2}) | (2[0-4]d) | (25[0-5]) ).

    其中,4个黑色文字的子表达式分别表示前述4种情况的匹配, 它们之间用逻辑或并列嵌入到外层的一个子表达式中(红色括号),最前面的  匹配单词边界, 最后的 . 匹配点号。

    (5) 回溯引用

    说明:

    有时我们想匹配文本中连续出现的2个重复单词,而不管单词内容是什么, 这种需求只能用子表达式的回溯引用来实现。在回溯引用时,若正则表达式中有若干个子表达式, 则 1 表示从左数起第1个子表达式,2 表示第2个子表达式,依此类推。 在许多实现里, 可用来代表整个正则表达式。

    示例文本

    There is a white white cat.
    The color of of the dog yellow.

    正则表达式

    (w+)[ ]+1

    匹配结果

    There is a white white cat.
    The color of of the dog yellow.

    解释:

    正则表达式中,(w+) 表示匹配1个单词, [ ]+ 表示匹配其后的1个或多个空格,最后的 1 就是回溯引用前面的子表达式 (w+) 中匹配的内容, 若 (w+) 匹配到 white,则 1 也去匹配 white;若 (w+) 匹配到 of,则 1 也去匹配 of。

    (6) 利用回溯匹配html配对标签

    示例文本

    <h1>This line is right.</h1>
    <h2>This line is also right.</h2>
    <h1>Wrong!!!</h2>

    正则表达式

    <h([1-6])>.*?</h1>

    匹配结果

    <h1>This line is right.</h1>
    <h2>This line is also right.</h2>
    <h1>Wrong!!!</h2>

    解释:

    对于<h>标签,其中数字只能配对出现, 故使用回溯子表达式,1 表示前面子表达式 ([1-6]) 已匹配到的数字。另外,注意这里使用了 *? 懒惰型次数匹配符。

    (7) 条件回溯

    说明:

    有时我们有这种需求,比如在 html 文件中, 我们想要匹配所有被<span>...</span>包裹的标签。但如果这个<span>被包裹在 <p>...</p>中,则把外层的<p>和</p>标签中的内容也一起匹配出来。

    示例文本

    <body>
    <span>something</span>
    <p><span>anything</span></p>
    <p class="abc"><span>everything</span></p>
    </body>

    正则表达式

    (<ps*[^>]*>s*)?<span>.*?</span>(?(1)s*</p>)

    匹配结果

    <body>
    <span>something</span>
    <p><span>anything</span></p>
    <p class="abc"><span>everything</span></p>
    </body>

    解释:

    这个正则表达式比较长,需要拆解开来分析:

    (<ps*[^>]*>s*)? <span>.*?</span> (?(1)s*</p>)

    先看黑体显示的第1个子表达式,这可以匹配: <p>或<p class="abc">,其后的 ? 表示 0 次或 1 次匹配,即<p>标签可以出现1次,也可以没有。

    其后的 <span>.*?</span> 部分比较简单, 可匹配<span>标签对及其中的文字内容,注意这里用了懒惰型元字符 *? 匹配 0 个或多个字符。

    最后是红色括号中的条件回溯,红字表示,若第1个子表达式有匹配, 则执行匹配后面的 s*</p>部分,若第1个子表达式没有出现匹配,则后面的 s*</p>也不作匹配。

    6. 前后查找元字符用法简单说明

    (1) 向前查找(lookahead)

    说明:

    有时我们想匹配某种模式之前的内容, 但又不想把这个模式本身给匹配出来,这时可用到前向查找。如下例中,我们想匹配冒号前的字符, 但又不想把冒号本身给匹配出来。

    示例文本

    http://www.initcircuit.com/
    https://www.initcircuit.com/

    正则表达式

    .+(?=:)

    匹配结果

    http://www.initcircuit.com/
    https://www.initcircuit.com/

    解释:

    正则表达式中,.+ 表示匹配1个或多个任意字符,(?=:)为匹配冒号, 但匹配结果仅为冒号前的字符(不包含冒号),这就是“向前查找”的含义。

    (2) 术语:消费(consume)

    说明:

    有些正则表达式文档会使用“消费”(consume)这一术语, 表示“匹配且返回文本”的含义。在上面的向前查找(lookahead)中的例子中,冒号被匹配但不在返回文本中, 故称为:不消费。

    (3) 向后查找(lookbehind)

    示例文本

    Tom: 80
    Jane: 95
    Jack: 100

    正则表达式

    (?<=:s*)d+

    匹配结果

    Tom: 80
    Jane: 95
    Jack: 100

    解释:

    本例中,需要匹配冒号后的数字,所以用到了向后查找 (?<=) 元操作符,由于冒号后还有若干个空格, 故用 s* 予以匹配,但冒号和空格都不出现在匹配结果中, 只出现后面 d+ 匹配的数字

    (4) 取反前后查找(negtive lookahead/lookbehind)

    说明:

    在下面的例子中,要匹配a开头的数字(但只取出数字)很容易, 只要使用普通的“向后查找”就可以了。但是如果要匹配那些不以a开头的纯数字(如下例中的80和95), 就需要用到“取反前后查找”了。

    示例文本

    Tom's cardnum is a01. His score is 80. Jane's cardnum is a02. Her score is 95.

    正则表达式

    (?<!a)d+

    匹配结果

    Tom's cardnum is a01. His score is 80. Jane's cardnum is a02. Her score is 95.

    解释:

    这里的 (?<!a) 就是取反向后查找, 把不是以 a 开头的数字给匹配出来。注意前后使用的  单词边界,如果不用  会把文中的 1 和 2 也匹配出来。

    8. Python 中使用正则表达式的方法及示例

    (1) 概述

    Python使用正则表达式需要导入 re 模块,可以直接调用 re的成员函数于对字符串进行正则表达式匹配,也可以通过把正则表达式先编译成一个“正则表达式对象”, 然后使用这个对象进行操作和匹配。这里仅介绍第一种方法。

    (2) re 的部分常用函数

    findall(pattern, string [,flags]) 在 string 中匹配 pattern,匹配结果用一列表返回
    finditer(pattern, string [,flags]) 同上,但返回一个迭代器
    split(pattern, string [,maxsplit = 0]) 根据 pattern 出现的位置拆分 string,返回字符串列表,参数 maxsplit 为最大拆分次数,默认全部拆分。
    sub(pattern, repl, string [,count = 0]) 使用 repl 替换 string 中出现的 pattern,返回替换后的新字符串。参数 count 为最大替换次数,默认全部替换。
    subn(pattern, repl, string [,count = 0]) 同上,但返回一个元组,其中包含新字符串和替换次数
    compile(str [,flags]) 编译正则表达式对象,这里暂不介绍

    (3) 示例一(将日期匹配出来)

    python代码

    import re
    text = 'The test date is from 2018/1/1 – 2018/12/31'
    patt = '(d{4})/(d{1,2})/(d{1,2})'
    re.findall(text, patt)

    执行结果

    [('2018', '1', '1'), ('2018', '12', '31')]

    解释:

    执行结果为 re.findall 函数返回的匹配结果列表。 由于正则表达式中使用了3个子表达式,故在结果中,把这3个子表达式的匹配结果分开放到了一个元组中。

    (4) 示例二:将日期格式替换成欧洲格式(即:日/月/年)

    python代码

    import re
    text = 'The test date is from 2018/1/1 – 2018/12/31'
    patt = '(d{4})/(d{1,2})/(d{1,2})'
    re.sub(patt, r'321', text)

    执行结果

    The test date is from 1/1/2018 - 31/12/2018

    解释:

    执行结果为 sub.re 函数返回的结果,其中 repl 用到了正则表达式中的子表达式回溯引用表示。

    9. JavaScript 中使用正则表达式的方法及示例

    (1) 概述

    在Js中,可以通过 String 对象和 RegEx 对象实现正则表达式处理, 这里仅介绍 String 对象的方法。注意在Js中,正则表达式首尾用两个“/”来括起, 这样可自动生成一个正则表达式对象,而不是双引号或单引号(用引号的话,就是字符串对象了)。

    (2) String 对象中关于正则表达式的函数

    str.search(regexp) 在 String 对象中查找匹配入参正则表达式 regexp,匹配成功则返回在字符串中首次匹配项的索引; 否则返回 -1
    str.match(regexp) 在 String 对象中查找匹配正则表达式 regexp,匹配成功则返回一个包含若干匹配信息的 Array(内容详见下例二), 未匹配则返回 null
    str.replace(regexp|substr, newSubStr) 将 String 对象内匹配到的 regexp 替换成 newSubStr,返回新字符串,原字符串不变。
    str.split(regexp [,limit]) 使用regexp描述的分隔符将一个 String 对象分割成字符串数组。

    (3) 示例一(search使用)

    Js代码

    var text = 'The fox, and the dog.';  // 生成1个String对象
    var regex = /[^ws]/;              // 匹配非字母和非空格
    var idx = text.search(regex);
    console.log(idx);
    console.log(text[idx])

    执行结果

    > 7
    > ","

    解释:

    search 匹配到的第一个非字母和非空格是“,”, 故返回其索引值:7。

    (4) 示例二(match使用)

    Js代码

    var text = 'For more information, see Chapter 3.4.5.1';  
    var regex = /see (Chapter d+(.d)*)/;      // 不使用 g 标志
    var ary = text.match(regex);
    console.log(ary);

    执行结果

    > ["see Chapter 3.4.5.1", 
    "Chapter 3.4.5.1", 
    ".1"
    index: 22,
    input: 'For more information, see Chapter 3.4.5.1']

    解释:

    可以看到返回 Array 中,各个子表达式的匹配。

    Js代码(regexp使用 g 标志)

    var text = 'For more information, see Chapter 3.4.5.1';  
    var regex = /see (Chapter d+(.d)*)/g;      // 使用 g 标志
    var ary = text.match(regex);
    console.log(ary);

    执行结果

    > ["see Chapter 3.4.5.1"]

    解释:

    使用 g 标志后,仅将整体匹配结果放入返回 Array 中。

    (5) 示例三(replace使用)

    Js代码

    var text = 'The fox, and the dog.';   
    var regex = /dog/;               
    var newtext = text.replace(regex, 'cat');
    console.log(newtext);

    执行结果

    > The fox, and the cat.

    解释:

    replace 匹配到 dog 后,用 cat 替换。 新字符串通过返回值返回,原字符串不变。

  • 相关阅读:
    JGrouseDoc使用(原创)
    MVP*2
    《天气与生活》修正近日总是显示数据有误的问题
    [Vista Gadget] 《农历小助手》和《天气与生活》发布新版
    Vista Sidebar gadget development(dropping)
    微软要干掉ADOBE?
    [JS]根据格式字符串分析日期(MM与自动匹配两位的09和一位的9),货币分析成浮点数
    Vista问题二则
    腾讯公司内部信息平台部门招聘.net资深开发工程师和项目经理
    ClientSortableTableExtender Ajax toolkit Extender(源码以后再发布和讲解)
  • 原文地址:https://www.cnblogs.com/initcircuit/p/10754680.html
Copyright © 2011-2022 走看看