Java中的正则表达式

Java中的正则表达式正则表达式语法\^$*+?{n}{n,}{n, m}?.(pattern)(?:pattern)(?=pattern)(?!pattern)(?=pattern)(?!pattern)x|y[xyz][^xyz][a-z][^a-z][:name:][=elt=][.elt….

Java中的正则表达式

正则表达式语法

\

  • 将下一个字符标记为:

    • 一个特殊字符
    • 一个原义字符(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. nm均为非负整数,其中 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的向后引用
    • 否则如果前面的条件都不满足,并且nm均为八进制数字0-7, 那么 \nm 将匹配八进制转义值nm

\nml

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

\un

  • Unicode转义字符序列

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

  • 示例:

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

\p{P}

  • 用于Unicode正则表达式前缀

    • 小写pproperty, 表示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://bianchenghao.cn/19811.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注