一、正则表达式的概念
正则表达式是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具。可以使用正则表达式来匹配、替换和拆分字符串。
二、匹配字符串
这是String类中的matches方法,这两个语句的结果均为True。
但是matches方法功能更加强大,它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集,这三个语句的结果也为True。
前面的“Java.*”是一个正则表达式,它描述了一个字符串模式,以Java开始,后面跟0个或者多个字符串。这里,子字符串.*匹配0或者多个任意字符。
三、语法
正则表达式由字面值字符和特殊符号组成。下图列出了正则表达式常用的语法。
上图是一些理论, 接下来让我们用一个实例来演示如何构建正则表达式。
实例
import java.util.regex.*;
class RegexExample1{
public static void main(String[] args){
String content = "I am noob " + "from runoob.com.";
String pattern = ".*runoob.*";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);
}
}
实例输出结果为:
字符串中是否包含了 'runoob' 子字符串? true
注:实例中使用了正则表达式 .*runoob.* 用于查找字符串中是否包了 runoob 子串:(来自菜鸟教程,一个很棒的网站!!!上链接)
Java 正则表达式 | 菜鸟教程 (runoob.com)
在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中(如 Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\。
根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。
四、替换和拆分字符串
如果字符串匹配正则表达式,String类的matches方法返回True。String类也包含了repalceAll、replaceFirst和split方法,用于替换和拆分字符串。
repalceAll方法替换所有匹配的子字符串,replaceFirst方法替换第一个匹配的子字符串。
有两个重载的split方法。split(regex)方法使用匹配的分隔符将一个字符串拆分为子字符串。
例如: 在split(regex,limit)方法中,limit参数确定模式匹配多少次。如果limit<=0,split(regex,limit)等同于split(regex)。如果limit>0,模式最多匹配limit-1次。
例如:
五、补充
java.util.regex 包主要包括以下三个类:
- Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
- Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
- PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。