String类中有public boolean matches(String regex)、public String replaceAll(String regex,String replacement)、public String[] split(String regex, int limit)等方法,这些方法中的参数regex是正则表达式(Regular Expression)字符串。正则表达式是根据一组字符串的共同特征来描述这组字符串的一个特殊字符串。正则表达式主要用于字符串的对比、分离、替换等操作。本节将介绍书写正则表达式的基本语法规则、String类中涉及正则表达式的相关方法、java.util.regex包中正则表达式相关类Pattern和Matcher。
1.普通字符串作为正则表达式
没有特殊含义的普通字符串作为正则表达式,如正则表达式“abc”只与内容一致的字符串“abc”匹配,例:
System.out.println("abc".matches("abc")); //打印true
正则表达式的用途主要体现在普通字符和特殊含义字符按一定的语法规则组合,表示某种字符串模式,下面分别介绍。
2.字符类
表7.1 字符类
注意:表中的中括号和其中的内容表示符合某种规则的一个字符,所以称为字符类(Character Classes)。
字符类举例:
3.预定义字符类
可以使用预定义的符号来表示某类字符,这些符号就是下面要介绍的预定义字符类,预定义字符类可以简化某些字符类的书写,如表7.2所示。
表7.2 预定义字符类
表7.2中左边一栏中的预定义字符类是右边一栏中相应字符类的简化方式,可使代码简洁不易出错。如:
上面代码中的正则表达式表示匹配邮政编码的字符串模式。最后一条语句中由于邮政编码字符串中含有非数字字符’a’,与指定正则表达式不匹配,所以打印false。
注意:由于’\’在转义字符中用于转义,因此要在字符串中表示’\’字符的字面值,必须用’\’对其进行转义,因此在字符串中预定义字符类“\d”的正确书写方式是“\\d”。
4.量词
量词用来指定字符在字符串中出现的次数,如表7.3所示。
表7.3 量词
(www.daowen.com)
注意:可以看到,上面两个表中,’.’、’?’、’*’、’+’等字符在正则表达式中有特殊含义,如果要在字符串中表示这些字符的字面值,也要在其前面添加“\\”。
前面例子中表示邮政编码的正则表达式“\\d”重复书写了6次,使用量词语法可简化书写,例:
Split( )方法举例:
仓库物品清单信息如下:“篮球20个,足球35个,排球15个,网球拍10个,羽毛球拍40个”。编写程序,统计体育用品总数。
replaceAll( )方法举例:
用’*’替换字符串中的所有敏感词。
String post = "吾生也敏感词1有涯,而敏感词2知也无涯";
//正则表达式中的'|'表示或。如:X|Y表示X或Y
System.out.println(post.replaceAll("敏感词1|敏感词2","*"));
5.Pattern与Matcher类
String类的方法matches( )、split( )和replaceAll( )用正则表达式操作字符串,也可以使用java.util.regex.Pattern类中的matches( )、split( )和java.util.regex.Mathcher类中replaceAll( )这些对等的方法实现相同的功能。Pattern与Matcher类提供了更全面和强大的正则表达式功能。
如果要频繁使用某个正则表达式,可以使用Pattern的静态方法public static Pattern compile(String regex)创建一个Pattern对象,这个对象就代表了参数regex所表示的正则表达式,然后调用该Pattern对象的public Matcher matcher(CharSequence input)方法,让Pattern对象所代表的模式和参数字符串input进行匹配,返回一个Matcher对象,该对象封装了匹配结果,可以通过该对象的一系列方法来获取各种匹配结果信息或对匹配字符串对象进行操作。下面通过一个简单例子说明这两个类的基本用法。
Pattern与Matcher基本用法示例:
结合上面具体代码对Pattern和Matcher的几个方法进行说明:
public static Pattern compile(String regex):调用Pattern的静态方法compile( ),实参是代表正则表达式的字符"\\d+",返回一个表示该正则表达式模式的Pattern类对象pattern。
public Matcher matcher(CharSequence input):调用pattern对象的matcher( )方法,实参inventory与pattern所代表的模式(正则表达式)进行匹配,返回匹配结果matcher对象。
public boolean find():尝试查找与该模式匹配的输入序列的下一个子序列。matcher对象封装了匹配信息。由于pattern表示的模式是一到多个数字字符,inventory字符串中有五个子字符串"20"、"35"、"15"、"10"和"40"依次与该模式相匹配,find( )每次调用都会查找到与该模式相匹配的下一个子字符串,返回true,直到第六次调用find( )才返回false。
public String group():返回由以前匹配操作所匹配的输入子序列。拿上面具体代码来说,调用find( )方法查找到第一个匹配的子字符串”20”时,调用group()将返回该子字符串”20”,再次调用find( )方法查找到第二个匹配的子字符串”35”时,调用group()将返回该子字符串”35”,以此类推。
有关正则表达式、Pattern和Matcher类更全面的知识请参考Java API文档。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。