java+正则表达+数字,认识Java正则表达式

正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。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!”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值