美文网首页
正则表达式学习笔记

正则表达式学习笔记

作者: 开心的许久 | 来源:发表于2018-02-12 17:53 被阅读0次

    本文为阅读《正则表达式必知必会》(修订版) Ben Forta著 杨涛等译 总结所得,以备后用,内容来自此书。

    正则表达式是一些用来匹配和处理文本的字符串。
    正则表达式的两种基本用途:搜索和替换。

    匹配单个字符

    符号 作用
    [\b] 回退Backspace
    \f 换页符
    \n 换行符
    \r 回车符
    \t 制表符
    \v 垂直制表符
    \r\n windows系统文本行结束标识
    \d 任何一个数字字符,等价于[0-9]
    \D 任何一个非数字字符,等价于[^0-9]
    \w 任何一个字母数字下划线,等价于[a-zA-Z0-9_]
    \W 任何一个非字母数字下划线,等价于[^a-zA-Z0-9_]
    \s 任何一个空白字符,等价于[\f\n\r\t\v],退格符例外
    \S 任何一个非空白字符,等价于[^\f\n\r\t\v],退格符例外

    英文字符.来表示任意字符,特殊字符需要用反斜杠转义(\)

    符号 作用
    [\b] 回退Backspace
    \f 换页符
    \n 换行符
    \r 回车符
    \t 制表符
    \v 垂直制表符
    \r\n windows系统文本行结束标识
    \d 任何一个数字字符,等价于[0-9]
    \D 任何一个非数字字符,等价于[^0-9]
    \w 任何一个字母数字下划线,等价于[a-zA-Z0-9_]
    \W 任何一个非字母数字下划线,等价于[^a-zA-Z0-9_]
    \s 任何一个空白字符,等价于[\f\n\r\t\v],退格符例外
    \S 任何一个非空白字符,等价于[^\f\n\r\t\v],退格符例外

    匹配一组字符

    利用[]表示字符集合,匹配之间的某一个字符
    []之间也可以放字符区间表示匹配范围内的某一个字符

    符号 作用
    A-Z 匹配从A到Z的所有大写字母
    a-z 匹配从a到z的所有小写字母
    A-z 匹配ASCII码从大写A到小写z之间的所有字符,不常用

    可以定义多个区间[A-Za-z0-9]
    取非匹配[^0-9],表示匹配任何不是数字的字符

    重复匹配

    匹配重复的字符1个或多个用+号
    匹配重复的字符0个或多个用*号
    匹配0个或1个字符用?号
    指定重复次数{次数}
    指定匹配次数的变化区间{2,4}表示最少重复2次,最多重复4次;{3,}表示至少重复3次
    元字符分为贪婪型元字符和懒惰型元字符,贪婪型匹配尽可能多的字符,懒惰型匹配尽可能多的字符,懒惰型元字符为贪婪型后加个?,如*为贪婪型字符,对应的懒惰型字符为*?,为了防止过度匹配,可以使用懒惰型元字符。

    位置匹配

    单词的边界 \b
    字符串的 边界 ^和$ 以字符开始和结束
    (?m)开头表示分行匹配

    子表达式

    子表达式必须用()括起来,子表达式允许嵌套,层数没有限制,表达式之间的或条件用 | 来表示

    回溯引用

    回溯引用允许正则表达式模式引用前面的匹配结果,模式的后半部分引用在前半部分中定义的子表达式,用\1 \2 ...来表示,1,2,3表示子表达式的位置,回溯表达式相当于引用变量。回溯表达式通常用1开始计数,在许多实现里,用0来代表整个正则表达式。

    回溯替换操作

    替换操作需要用到两个正则表达式:一个用来给出搜索模式,另一个用来给出匹配文本的替换模式。回溯引用可以跨模式使用,在第一个模式里被匹配的子表达式可以用在第二个模式里。

    前后查找

    操作符 作用
    (?=) 正向前查找
    (?!) 负向前查找
    (?<=) 正向后查找
    (?<!) 负向后查找

    匹配网页标题

    (?<=<[Tt][Ii][Tt][Ll][Ee]>).*(?=<[Tt][Ii][Tt][Ll][Ee]>)
    

    嵌入条件

    正则表达式里的条件用?来定义。
    ?匹配前一个字符或表达式,如果存在的话。
    ?=和?<=匹配前面或后面的文本,如果存在的话。

    MySQL

    MySQL对正则表达式的支持体现在允许在WHERE子句中使用如下格式的表达式:

    REGEXP "expression"
    

    功能有如下限制:

    1. 只提供搜索支持,不支持使用正则表达式进行替换操作。
    2. 默认搜索不区分字母大小写,需要在REGEXP和模式之间加BINARY关键字。
    3. [[:<:]]来匹配单词开头,用[[:>:]]匹配单词结束
    4. 不支持向前预测
    5. 不支持嵌入条件
    6. 不支持八进制字符搜索
    7. 不支持\a \b \e \f \v
    8. 不支持回溯引用

    JAVA

    Java中的正则表达式匹配功能主要是通过java.util.regex.Matcher类和以下这些方法实现的。

    find(): 在一个字符串里寻找一个给定的模式匹配。
    lookingAt(): 用一个给定的模式去尝试匹配一个字符串的开头。
    matches(): 用一个给定的模式去尝试匹配一个完整的字符串。
    replaceAll(): 进行替换操作,对所有匹配都进行替换。
    replaceFirst(): 进行替换操作,只对第一个匹配进行替换。
    

    java.util.regex.Pattern类提供了几个简单易用的包装器方法。

    compile(): 把一个正则表达式编译成一个模式。
    flags(): 返回某给定模式的匹配标志。
    matches(): 在功能上等价于刚才介绍的matches()方法。
    pattern(): 把一个模式还原为一个正则表达式。
    split(): 把一个字符串拆分为子字符串。
    

    java的正则表达式与Perl基本兼容,有几点需要注意。

    1. 不支持嵌入条件
    2. 不支持使用\E \l \L \u \U 进行字母大小写转换。
    3. 不支持使用[\b]匹配退格符。
    4. 不支持\z。

    常见问题的正则表达式解决方案

    IP地址

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

    URL地址

    (https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
    

    电子邮件地址

    (\w+\.)*\w+@(\w+\.)+[A-Za-z]+
    

    HTML注释

    <!-{2,}.*?-{2,}>
    

    JavaScript注释

    //.*
    

    相关文章

      网友评论

          本文标题:正则表达式学习笔记

          本文链接:https://www.haomeiwen.com/subject/slcdtftx.html