Java 正则表达式
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串。
java.util.regex 包主要包括以下三个类:
-
Pattern 类:pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
-
Matcher 类:Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
-
PatternSyntaxException:PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
实例:
import java.util.regex.Pattern;
public class RegexExample1 {
public static void main(String[] args){
String content = "I an noob "+ "from cnblogs.com.";
String pattern = ".*cnblogs.*";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println("字符串中是否包含了‘cnblogs’字字符串?"+ isMatch);
}
}
输出:
字符串中是否包含了‘cnblogs’字字符串?true
捕获组
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
实例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main(String[] args){
// 按指定模式在字符串中查找
String line = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建Pattern对象
Pattern r = Pattern.compile(pattern);
// 创建matcher对象
Matcher m = r.matcher(line);
if (m.find()){
System.out.println(m.group(0)); // group(0),代表整个表达式
System.out.println(m.group(1)); // 第一个捕获组
System.out.println(m.group(2)); // 第二个捕获组
System.out.println(m.group(3)); // 第三个捕获组
}
else {
System.out.println("NO MATCH");
}
}
}
输出:
This order was placed for QT3000! OK?
This order was placed for QT
3000
! OK?
正则表达式语法
在其他的语言中(如Python),一个反斜杠 \
就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\
代表其他语言中的一个 \
,这也就是为什么表示一位数字的正则表达式是 \\d
。
matches 和 lookingAt 方法
matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是:
-
matches 要求整个序列都匹配,而lookingAt 不要求。
-
lookingAt 方法需要从第一个字符开始匹配。
实例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "foo";
private static final String INPUT = "fooooooooo";
private static final String INPUT2 = "oooooof0000000";
private static Pattern pattern;
private static Matcher matcher;
private static Matcher matcher2;
public static void main(String[] args){
pattern = Pattern.compile(REGEX);
matcher = pattern.matcher(INPUT);
matcher2 = pattern.matcher(INPUT2);
System.out.println("Current REGEX is:"+REGEX);
System.out.println("CURRENT INPUT is:"+ INPUT);
System.out.println("CURRENT INPUT2 is:"+ INPUT2);
System.out.println("lookingAt():"+matcher.lookingAt());
System.out.println("matchers():"+ matcher.matches());
System.out.println("lookingAt():"+matcher2.lookingAt());
}
}
输出:
Current REGEX is:foo
CURRENT INPUT is:fooooooooo
CURRENT INPUT2 is:oooooof0000000
lookingAt():true
matchers():false
lookingAt():false
replaceFirst 和 replaceAll 方法
replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。
实例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "dog";
private static String INPUT = "The dog says meow."+
"All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args){
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT);
String str1 = m.replaceAll(REPLACE); // 将所有dog替换成cat
String str2 = m.replaceFirst(REPLACE); // 将第一个dog替换成cat
System.out.println(str1);
System.out.println(str2);
}
}
输出:
The cat says meow.All cats say meow.
The cat says meow.All dogs say meow.
每天学习一点点,每天进步一点点。