美文网首页
正则表达式详解!Java中正则表达式语法分析和使用

正则表达式详解!Java中正则表达式语法分析和使用

作者: 老程不秃 | 来源:发表于2022-02-08 13:18 被阅读0次

    正则表达式语法

    \

    将下一个字符标记为:

    一个特殊字符

    一个原义字符(12个) : ^, $, (, ), *, +, ?, ., [, , {, |

    一个向后引用

    一个八进制转义符

    示例:

    \n - 换行符

    \ \ - \

    \ ( - (

    ^

    匹配输入字符串的开始位置

    如果设置RegExp对象的Multiline属性, ^也匹配\n或\r之后的位置

    $

    匹配输入字符串的结束位置

    如果设置RegExp对象的Multiline属性, $也匹配\n或\r之前的位置

    *

    匹配前面的子表达式零次或多次

    等价于 {0,}

    示例:

    zo* - z 或 zo 或 zoo

    +

    匹配前面的子表达式一次或多次

    等价于 {1,}

    示例:

    zo+ - zo 或 zoo

    ?

    匹配前面的子表达式零次或一次

    等价于 {0,1}

    示例:

    do(es)? - do 或 does

    {n}

    匹配确定的n次. n是一个非负整数

    示例:

    o{2} - 不能匹配Bob,能匹配food

    {n,}

    至少匹配n次. n是一个非负整数

    o{0,} 等价于 o*

    o{1,} 等价于 o+

    示例:

    o{2,} - 不能匹配Bob,能匹配looooog

    {n, m}

    最少匹配n次,最多匹配m次. n和m均为非负整数,其中n<=m

    o{0,1} 等价于 o?

    示例:

    o{1,3} - 匹配loooooog的前三个o

    ?

    非贪心量化:当该字符紧跟在其余任何一个修饰符 *, +, ?, {n}, {n,}, {n,m} 后面时,匹配模式是非贪心的

    非贪心模式是尽可能少的匹配所搜索的字符串

    正则表达式默认是贪心模式,是尽可能多的匹配所搜索的字符串

    示例:

    o+? - 匹配loooooog中的单个o

    o+ - 匹配loooooog所有的o

    .

    匹配除了 \r, \n 以外的任何单个字符

    如果需要匹配 \r, \n 在内的字符,需要使用 (.|\r|\n)

    (pattern)

    匹配pattern并获取匹配的子字符串,子字符串用于向后引用

    获取的匹配可以从产生Matches的集合中得到

    (?:pattern)

    匹配pattern但是不获取匹配的子字符串

    这是一个非获取匹配,不存储匹配的子字符串用于向后引用

    在替换使用或字符 | 来组合一个模式的各个部分时非常有用

    示例:

    industr(?:y|ies) 等价于 industry | industries

    (?=pattern)

    正向肯定预查:在任何匹配pattern的字符串开始处匹配查找字符串

    这是一个非获取匹配,即这个匹配不需要获取供以后使用

    预查不会消耗字符.也就是说,在一个匹配开始时,在最后一个匹配发生之后立即开始下一次匹配搜索,而不是从包含预查字符后面的字符开始匹配搜索

    示例:

    Windows(?=95|98|NT|2000) - 可以匹配 Windows2000 中的 Windows , 但是不能匹配 Windows10 中的 Windows

    (?!pattern)

    正向否定预查:在任何不匹配pattern的字符串开始处匹配查找字符串

    这是一个非获取匹配,即这个匹配不需要获取供以后使用

    预查不会消耗字符.也就是说,在一个匹配开始时,在最后一个匹配发生之后立即开始下一次匹配搜索,而不是从包含预查字符后面的字符开始匹配搜索

    示例:

    Window(?!95|98|NT|2000) - 可以匹配 Windows10 中的 Windows , 但是不能匹配 Windows2000 中的 Windows

    (?<=pattern)

    反向肯定预查:在任何匹配pattern的字符串处反向匹配查找字符串

    示例:

    (?<=95|98|NT|2000)Windows - 可以匹配 2000Windows 中的 Windows , 但是不能匹配 10Windows 中的 Windows

    (?<!pattern)

    反向否定预查:在任何不匹配pattern的字符串处反向匹配查找字符串

    示例:

    (?<!95|98|NT|2000)Windows - 可以匹配 10Windows中的 Windows , 但是不能匹配 2000Windows 中的 Windows

    x|y

    或匹配

    如果没有包含在括号中,范围就是整个正则表达式. 否则只是对括号中的字符串进行匹配

    示例:

    z|food - z 或 food

    (z|f)oo - zoo 或 foo

    [xyz]

    字符集合. 匹配所包含的任意一个字符

    仅有特殊字符反斜线 \ 可以保持特殊含义的转义字符. 其余符号比如 *, +, (, ) 等均是普通字符

    脱字符 ^ 如果出现在首位表示负值字符集合. 如果出现在字符中间就是普通字符

    连字符 - 如果出现在字符串中间表示字符范围. 如果出现在首位或者末尾就是普通字符

    右括号如果出现在首位也是普通字符

    示例:

    [abc] - 可以匹配 plain 中的 a

    [^xyz]

    排除型字符集合. 匹配未列出的任意字符

    示例:

    [^abc] - 可以匹配 plain 中的 plin

    [a-z]

    字符范围. 匹配指定范围内的任意字符

    示例:

    [a-z] - 可以匹配 a 到 z 范围内的任意小写字母字符

    [^a-z]

    排除型字符范围. 匹配任何不在指定范围内的任意字符

    示例:

    [^a-z] - 匹配不在 a 到 z 范围内的任意字符

    [:name:]

    增加命名字符类中的字符到表达式. 只能用于方括号表达式

    [=elt=]

    增减当前locale下排序等价于elt的字符. 只能用于方括号表达式

    [.elt.]

    增加排序元素elt到表达式中. 只能用于方括号表达式

    这个语法用于某些排序元素由多个字符组成. 比如29个字母表的西班牙语,CH作为单个字母排在字母C之后,因此会产生排序cinco, credo, chispa

    \b

    匹配单词边界.即单词和空格间的位置

    示例:

    er\b - 可以匹配 never 中的 er , 不能匹配 verb 中的 er

    \B

    匹配非单词边界

    示例:

    er\B - 可以匹配 verb 中的 er , 不能匹配 never 中的 er

    \cx

    匹配由x指明的控制字符

    x的值必须为A-Z或者a-z的字符之一,否则就将c看作是一个原义的c字符

    控制字符的值等于x的值的最小5 bit(对十进制32的余数)

    示例:

    \cM - 匹配Control-M 或者 回车符

    \ca - \u001

    \cb - \u002

    \d

    匹配一个数字字符

    等价于 [0-9]

    \D

    匹配一个非数字字符

    等价于 [^0-9]

    \f

    匹配一个换页符

    等价于 \x0c 和 \cL

    \n

    匹配一个换行符

    等价于 \x0a 和 \cJ

    \r

    匹配一个回车符

    等价于 \x0d 和 \cM

    \s

    匹配任何空白字符

    包括空格,制表符,换页符等

    等价于 [ \f\n\r\t\v]

    \S

    匹配任何非空白字符

    等价于 [^ \f\n\r\t\v]

    \t

    匹配一个制表符

    等价于 \x0b 和 \cI

    \v

    匹配一个垂直制表符

    等价于 \x0b 和 \cK

    \w

    匹配包括下划线的任何单词字符

    等价于 [A-Za-z0-9_]

    \W

    匹配任何非单词字符

    等价于 [^A-Za-z0-9_]

    \xnn

    十六进制转义字符序列. 匹配两个十六进制数字nn表示的字符

    正则表达式中可以使用ASCII编码

    \x041 等价于 \x04&1

    示例:

    \x41 - A

    \num

    向后引用一个子字符串,该子字符串与正则表达式的第num个用括号围起来的子表达式匹配

    num是从1开始的十进制正整数,上限可以是9, 31, 99甚至无限

    示例:

    (.)\1 - 匹配两个连续的相同字符

    \n

    标识一个八进制转义值或一个向后引用:

    如果 \n 之前至少n个获得子表达式,则n为向后引用

    否则,n为八进制数字0-7.此时n为八进制转义值

    \nm

    标识一个八进制转义值或一个向后引用

    如果 \nm 之前至少nm个获得子表达式,则nm为向后引用

    如果 \nm 之前至少有n个获得子表达式,则n为一个后跟文字m的向后引用

    否则如果前面的条件都不满足,并且n和m均为八进制数字0-7,那么 \nm 将匹配八进制转义值nm

    \nml

    如果n为八进制数字0-3,并且m和l均为八进制数字0-7,那么 \nml 将匹配八进制转义值nml

    \un

    Unicode转义字符序列

    n是一个使用4个十六进制数字表示的Unicode字符

    示例:

    \u00A9 - 匹配著作权符号 (©)

    \p{P}

    用于Unicode正则表达式前缀

    小写p是property,表示Unicode属性

    大括号中的P表示Unicode字符集中七个字符属性之一的标点字符.还有其余六个属性:

    L :字母

    M :标记符号. 通常不会单独出现

    Z :分隔符. 比如空格,换行等

    S :符号. 比如数学符号,货币符号等

    N :数字. 比如阿拉伯数字,罗马数字等

    C :其余字符

    注意:在JavaScript中不支持该语法

    \ < \ >

    匹配词word的开始\ <和结束\ >

    示例:

    \ <the\ > - 可以匹配字符串 for the wise 中的 the , 不能匹配 otherwise 中的 the

    ()

    将 ( 和 ) 之间的表达式定义为组group,并且将匹配这个表达式的字符保存到一个临时区域. 一个正则表达式最多可以保存9个这样的临时区域,分别使用 \1 到 \9 的符号来引用

    |

    将两个匹配条件进行逻辑或or运算

    示例:

    (him|her) - 可以匹配 it belongs to hin 或 it belongs to her, 不能匹配 it belongs to them

    正则表达式使用场景

    字符串替换

    转换日期格式示例

    Matcher

    Matcher类中提供四个将匹配字符串替换成指定字符串的方法:

    replaceAll()

    replaceFirst()

    appendReplacement()

    appendTail()

    重点掌握一下appendReplacement()方法和appendTail()方法

    appendReplacement()

    appendReplacement(StringBuffer sb, String replacement):

    将当前匹配子串替换为指定字符串

    并且将替换后的子串以及到上次匹配之后的字符串添加到一个StringBuffer对象

    appendTail()

    appendTail(StringBuffer sb):

    将最后一次匹配后剩余的字符添加到一个StringBuffer对象

    示例

    字符串fatcatfatcatfat,正则表达式模式cat:

    第一次匹配后调用appendReplacement(sb, "dog"),这时StringBuffer内容为fatdog.即fatcat中的cat被替换为dog并且与匹配子串前的内容加到sb里

    第二次匹配后调用appendReplacement(sb, "dog"),这时sb的内容就成为fatdogfatdog

    最后一次调用appendTail(sb),那么sb的内容成为fatdogfatdogfat

    字符校验

    正则表达式校验示例

    相关文章

      网友评论

          本文标题:正则表达式详解!Java中正则表达式语法分析和使用

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