添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Java流程控制语句
4 Java字符串处理
4.1 Java定义字符串
4.2 小白如何使用Java API帮助文档?
4.3 Java String和int的相互转换
4.4 Java字符串拼接
4.5 Java获取字符串长度
4.6 Java字符串大小写转换
4.7 Java去除字符串中的空格
4.8 Java提取子字符串
4.9 Java分割字符串
4.10 Java截取新闻标题
4.11 Java字符串的替换
4.12 Java字符串替换实例
4.13 Java字符串比较
4.14 Java中容易混淆的空字符串和null
4.15 Java查找字符串
4.16 【Java项目实战】校验文件名和邮箱地址
4.17 Java字符串实现简单加密解密
4.18 Java StringBuffer类
4.19 Java利用StringBuffer替换特殊字符
4.20 String、StringBuffer和StringBuilder的区别
4.21 Java正则表达式
4.22 Pattern和Matcher的使用
4.23 Java正则表达式验证电话号码
4.24 Java使用正则表达式验证IP地址
Java数字和日期处理 Java内置包装类 Java数组处理 Java类和对象 Java继承和多态 Java异常处理 Java集合、泛型和枚举 Java反射机制 Java输入/输出流 Java注解
正则表达式(Regular Expression) 又称正规表示法、常规表示法,在代码中常简写为 regex、regexp 或 RE,它是计算机科学的一个概念。
正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,是一种可以用于模式匹配和替换的规范。一个正则表达式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。
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”这样的字符串,那么正则表达式也就不值得学习了。正则表达式作为一个用于匹配字符串的模板,将某个字符模式与所搜索的字符串进行匹配。本文简单了解一下如何使用正则表达式来操作字符串。 正则表达式支持字符 创建正则表达式就是创建一个特殊的字符串。正则表达式所支持的合法字符如表 1 所示。
表 1 正则表达式所支持的合法字符 字符x(x 可代表任何合法的字符) \0mnn 八进制数 0mnn 所表示的字符 十六进制值 0xhh 所表示的字符 \uhhhh 十六进制值 0xhhhh 所表示的 Unicode 字符 制表符(“\u0009”) 新行(换行)符(‘\u000A’) 回车符(‘\u000D’) 换页符(‘\u000C’) 报警(bell)符(‘\u0007’) Escape 符(‘\u001B’) x 对应的的控制符。例如, \cM 匹配 Ctrl-M。x 值必须为 A~Z 或 a~z 之一。 "\u0061\t"  // 匹配a<制表符>
"\\?\\["    // 匹配?[

注意:可能大家会觉得第一个正则表达式中怎么有那么多反斜杠?这是由于 Java 字符串中反斜杠本身需要转义,因此两个反斜杠(\\)实际上相当于一个(前一个用于转义)。
上面的正则表达式依然只能匹配单个字符,这是因为还未在正则表达式中使用“通配符”,“通配符”是可以匹配多个字符的特殊字符。正则表达式中的“通配符”远远超出了普通通配符的功能,它被称为预定义字符,正则表达式支持如表 3 所示的预定义字符。
表 3 预定义字符 预定义字符 可以匹配任何字符 匹配 0~9 的所有数字 匹配非数字 匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等 匹配所有的非空白字符 匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线 _ 匹配所有的非单词字符 c\\wt    // 可以匹配cat、cbt、cct、cOt、c9t等一批字符串
\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d    // 匹配如 000-000-0000 形式的电话号码

在一些特殊情况下,例如,若只想匹配 a~f 的字母,或者匹配除 ab 之外的所有小写字母,或者匹配中文字符,上面这些预定义字符就无能为力了,此时就需要使用方括号表达式,方括号表达式有如表 4 所示的几种形式。
表 4 方括号表达式 方括号表达式 例如 [abc] 表示 a、b、c 其中任意一个字符; [gz] 表示 g、z 其中任意一个字符 表示范围:- 例如 [a-f] 表示 a~f 范围内的任意字符; [\\u0041-\\u0056] 表示十六进制字符 \u0041 到 \u0056 范围的字符。范围可以和枚举结合使用,如 [a-cx-z] ,表示 a~c、x~z 范围内的任意字符 表示求否:^ 例如 [^abc] 表示非 a、b、c 的任意字符; [^a-f] 表示不是 a~f 范围内的任意字符 表示“与”运算:&& 例如 [a-z&&[def]] 是 a~z 和 [def] 的交集,表示 d、e
f[a-z&&^bc]] 是 a~z 范围内的所有字符,除 b 和 c 之外
[ad-z] [a-z&&[m-p]] 是 a~z 范围内的所有字符,除 m~p 范围之外的字符 表示“并”运算 并运算与前面的枚举类似。例如 [a-d[m-p]] 表示 [a-dm-p] 方括号表达式比前面的预定义字符灵活多了,几乎可以匹配任何字符。例如,若需要匹配所有的中文字符,就可以利用 [\\u0041-\\u0056] 形式——因为所有中文字符的 Unicode 值是连续的,只要找出所有中文字符中最小、最大的 Unicode 值,就可以利用上面形式来匹配所有的中文字符。
正则表达式还支持圆括号,用于将多个表达式组成一个子表达式,圆括号中可以使用或运算符 | 。例如,正则表达式“((public)|(protected)|(private))”用于匹配 Java 的三个访问控制符其中之一。
除此之外,Java 正则表达式还支持如表 5 所示的几个边界匹配符。
表 5 边界匹配符 边界匹配符 单词的边界 非单词的边界 输入的开头 前一个匹配的结尾 输入的结尾,仅用于最后的结束符 输入的结尾 前面例子中需要建立一个匹配 000-000-0000 形式的电话号码时,使用了 \\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d 正则表达式,这看起来比较烦琐。实际上,正则表达式还提供了数量标识符,正则表达式支持的数量标识符有如下几种模式。
Greedy(贪婪模式):数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。如果你发现表达式匹配的结果与预期的不符,很有可能是因为你以为表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去。 Reluctant(勉强模式):用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。 Possessive(占有模式):用加号后缀(+)表示,目前只有 Java 支持占有模式,通常比较少用。 三种模式的数量表示符如表 6 所示。
表 6 三种模式的数量表示符 X表达式出现零次或一次 X表达式出现零次或多次 X表达式出现一次或多次 X{n}? X{n}+ X表达式出现 n 次 X{n,} X{n,}? X{n,}+ X表达式最少出现 n 次 X{n,m} X{n,m}? X{n,m}+ X表达式最少出现 n 次,最多出现 m 次 String str = "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!”。

关注公众号「 站长严长生 」,在手机上阅读所有教程,随时随地都能学习。内含一款搜索神器,免费下载全网书籍和视频。

微信扫码关注公众号