admin管理员组文章数量:1579356
正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。String类里也提供了如下几个特殊的方法。
➢boolean matches(String regex);判断该字符串是否匹配指定的正则表达式。
➢String replaceAll(String regex, String replacement): 将该字符串中所有匹配regex的子串替换成
replacement。
➢String replaceFirst(String regex, String replacement): 将该字符串中第一个匹配 regex的子串替换
成replacement。
➢String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。
上面这些特殊的方法都依赖于Java 提供的正则表达式支持,除此之外,Java 还提供了Pattern 和Matcher两个类专门用于提供正则表达式支持。
很多人都会觉得正则表达式是一个非常神奇、高级的知识,其实正则表达式是一种非常简单而且非常实用的工具。正则表达式是一个用于匹配字符串的模板。实际上,任意字符串都可以当成正则表达式使用,例如”abc”,它也是一个正则表达式,只是它只能匹配”abc”字符串。如果正则表达式仅能匹配”abc”这样的字符串,那么正则表达式也就不值得学习了。下面开始学习如何创建正则表达式。
正则表达式就是一个用于匹配字符串的模板,可以匹配一批字符串, 所以创建正则表达式就是创建一个特殊的字符串。正则表达式所支持的合法字符如表所示。
字符
解释
x
字符x (x可代表任何合法的字符)
\0mnn
八进制数0mnn所表示的字符
\xhh
十六进制值0xhh所表示的字符
\uhhhh
十六进制值0xhhhh所表示的Unicode字符
\t
制表符(^u0009*)
\n
新行(换行)符(\u000A’)
\r
回车符(“u000D’)
\f
换页符(\u00C”)
\a
报警(bel)符(nz0007”)
\e
Escape符(“u001B’)
\cx
对应的的控制符。例如,\cM匹配Ctrl-M。x值必须为A~Z或a~z之- - 。
除此之外,正则表达式中有一些特殊字符, 这些特殊字符在正则表达式中有其特殊的用途,比如前面介绍的反斜线()。 如果需要匹配这些特殊字符,就必须首先将这些字符转义,也就是在前面添加一个反斜线()。 正则表达式中的特殊字符如表所示。
特殊字符
说明
$
匹配-行的结尾。要匹配$字符本身,请使用\$
^
匹配一行的开头。要匹配^字符本身,请使用\^
()
标记子表达式的开始和结束位置。要匹配这些字符,请使用\(和\)
[]
用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用\[和\]
{}
用于标记前面子表达式的出现频度。要匹配这些字符,请使用\{和\}
*
指定前面子表达式可以出现零次或多次。要匹配字符本身,请使用\*
+
指定前面子表达式可以出现一次或多次。 要匹配+字符本身,请使用\+
?
指定前面子表达式可以出现零次或-一次。要匹配?字符本身,请使用\?
.
匹配除换行符\n 之外的任何单字符。要匹配.字符本身,请使用\.
\
用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用\\
|
指定两项之间任选一-项。如果要匹配字符本身,请使用\|
将上面多个字符拼起来,就可以创建一个正则表达式。例如:
"\u0041\\\\"//匹配A\
"\u0061\t"//匹配a
"\\?\\["//匹配?[
表达式中[],(),{}的区别
1.方括号是单个匹配 字符集/排除字符集/命名字符集
在一些特殊情况下,例如,若只想匹配a~f的字母,或者匹配除了ab 之外的所有小写字母,或者匹配中文字符,上面这些预定义字符就无能为力了,此时就需要使用方括号表达式,方括号表达式有如表几种形式。
方括号表达式
说明
表示枚举
例如[abc],表示a、b、c其中任意一个字符; [gz], 表示g、z其中任意一个字符
表示范围: -
例如[a-f],表示a~f范围内的任意字符; [\0041-\u0056], 表示十六进制字符\u0041到\u0056范围的字符。 范围可以和枚举结合使用,如[a-cx-z], 表示a~c、x~Z范围内的任意字符
表示求否: ^
例如[^abc],表示非a、b、c的任意字符: [^a-f], 表示不是a~f范围内的任意字符
表示“与”运算: &&
例如[a-z&&[def],求a~z和[def]的交集,表示小e或f [a-z&&[^bc],a~z 范围内的所有字符,除了b和c之外,即[ad-z][a-z&&[^m-pl], ar z范围内的所有字符,除了m~p范围之外的字符,即[a-Iq-z]
表示“并”运算
并运算与前面的枚举类似。例如[a-d[m-p]],表示[a-dm-p]
提示:
方括号表达式比前面的预定义字符灵活多了,几乎可以匹配任何字符。例如,若需要|匹配所有的中文字符,就可以利用[\u0041-\u0056]形式一因 为所有中文字符的Unicode值是连续的,只要找出所有中文字符中最小、最大的Unicode值,就可以利用,上面形式来|匹配所有的中文字符。
2.圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理
正则表示还支持圆括号表达式,用于将多个表达式组成一个子表达式,圆括号中可以使用或运算符(|)。例如,正则表达式”((public)l(protected)|(private)”用于匹配Java的三个访问控制符其中之一
也就是说圆括号()是一体的,要么重现要么不出现。如:(abc)? 表示这一组要么一起出现,要么不出现,出现那则按顺序出现
第一个正则表达式中怎么有那么多反斜杠啊?这是由于Java字符串中反斜杠本身需要转义,因此两个反斜杠()实际上相当于一个(前一个用于转义)。上面的正则表达式依然只能匹配单个字符,这是因为还未在正则表达式中使用“通配符”,“通配符”
是可以匹配多个字符的特殊字符。正则表达式中的“通配符”远远超出了普通通配符的功能,它被称为预定义字符,正则表达式支持所示的预定义字符。
预定义字符
预定义字符
说明
.
可以匹配任何字符
\d
匹配0~9的所有数字
\D
匹配非数字
s
匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等
\S
匹配所有的非空白字符
\w
匹配所有的单词字符,包括0~9所有数字、26个英文字母和下画线(_ )
\W
匹配所有的非单词字符
提示:
上面的7个预定义字符其实很容易记忆一-d 是digit 的意思,代表数字;s是space的意思,代表空白; w是word的意思,代表单词。d、s、 w的大写形式恰好匹配与之相反的字符。有了,上面的预定义字符后,接下来就可以创建更强大的正则表达式了。例如:
c\\wt//可以匹配cat、cbt、cct、c0t、c9t等一批字符串
\\d\ld\\d-\\d\\d\\d-\\d\\d\\d\\d//匹配如 000-000-0000 形式的电话号码
除此之外,Java正则表达式还支持如表几个边界匹配符。
边界匹配符
说明
^
行的开头
$
行的结尾
\b
单词的边界
\ B
非单词的边界
\A
输入的开头
\G
前一个匹配的结尾
\Z
输入的结尾,仅用于最后的结束符
\z
输入的结尾
前面例子中需要建立一个匹配000-000-0000形式的电话号码时,使用了\d\d-l\d\d-\d\dN\d\d正则表达式,这看起来比较烦琐。实际上,正则表达式还提供了数量标识符,正则表达式支持的数量标识符有如下几种模式。
➢Greedy (贪婪模式):数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直到无法匹配为止。如果你发现表达式匹配的结果与预期的不符,很有可能是因为
一你以为 表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去。
➢Reluctant (勉强模式):用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。
➢Possessive (占有模式):用加号后缀(+) 表示,目前只有Java支持占有模式,通常比较少用。
三种模式的数量表示符
贪婪模式
勉强模式
占用模式
说明
X?
X??
X??
X表达式出现零次或一次
X*
X*?
X*?
X表达式出现零次或多次
X+
X+?
X+?
X表达式出现一次或多次
X{n}
X{n}?
X{}?
x表达式出现n次
X{n,}
X{n,}?
X{n,}?
X表达式最少出现n次
X {n,m}
X {n,m}?
X {n,m}?
X表达式最少出现n次,最多出现m次
关于贪婪模式和勉强模式的对比,看如下代码: ;
Stringstr-"hello, java!";
//贪婪模式的正则表达式
System.out.println(str.replaceFirst("\\w*","■"));
//输出■ ,java!
;//勉强模式的正则表达式
System.out.println(str.replaceFirst("\\w*?"," "));
//输出hello ,java!
当从”hello , java!”字符串中查找匹配”\w“子串时,因为”\w“使用了贪婪模式,数量表示符()会一直匹配下去,所以该字符串前面的所有单词字符都被它匹配到,直到遇到空格,所以替换后的效果是“■, java!”; 如果使用勉强模式,数量表示符()会尽量匹配最少字符,即匹配0个字符,所以替换后的结果是“■hello , java!”。
版权声明:本文标题:java+正则表达+数字,认识Java正则表达式 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727847531a1133265.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论