**正则表达式(RegEx)**是一个强大的工具,帮助我们以灵活、动态和高效的方式匹配模式,并根据结果进行操作。
在这个简短的指南中,我们将看看内置的RegEx方法,它是String类的一部分,使我们能够避免使用
Pattern和Matcher类的麻烦。
标准Java API中的regex 包已经向我们介绍了Pattern 和Matcher 类,我们可以用它们来表示正则表达式并检查是否匹配。不过,这需要创建和使用两个额外的对象--虽然工作得很好,但有点啰嗦,也没有必要。
客户端非常需要一个更干净、更优雅的解决方案,用于简单的匹配,String 类被赋予了一些与正则表达式相关的方法。
在引擎盖下发生了什么?
嗯,和你想象的完全一样--这些方法最终调用了regex 模块中的类,使用字符串RegEx方法在技术上和使用这些类本身是完全一样的--只是更干净,更不繁琐。
**注意:**在大多数情况下,你会更喜欢使用内置方法,因为这一点。
*matches()*方法
matches() 方法的工作方式与Matcher 对象的matches() 方法的工作方式基本相同,从Pattern 对象返回,给定一个特定的 RegEx。这是因为它本来就会调用这些精确的方法。
它接受一个字符串表示的正则表达式,并根据整个字符串是否与RegEx相匹配返回一个boolean - 注意整个字符串必须与之匹配,否则将返回false 。
String string = "Hello there!";
boolean matches = string.matches(".*Hello.*");
if (matches) {
System.out.println("General Kenobi.");
}
**注意:**令人惊讶的是,matches() 方法不支持添加Pattern 枚举,如CASE_INSENSITIVE ,实际上默认为CASE_SENSITIVE 。对于这些,你将不得不使用源类本身。
我们的RegEx检查序列"Hello" ,其前后有任意数量的字符,所以自然是匹配的,结果是。
General Kenobi.
对于那些感兴趣的人,matches() 方法看起来像这样。
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
这只是调用
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
也就是说,该方法默认是区分大小写的。
*split()*方法
split() 方法是一个常用的方法。很多人都知道这个方法是根据给定的字符/分隔符来分割字符串的,然而,这并不完全准确。
split()方法是根据给定的正则表达式的每次出现来分割字符串。
如果你的RegEx是一个单一的字符,它将在该字符的实例上进行分割--不过,你并不局限于单一字符。你可以在任何RegEx上分割字符串。
最常见的使用情况是分割一个CSV格式的输入字符串。
String countries = "England,Japan,Italy,Kenya,Mexico";
String[] splits = countries.split(",");
for (String country: splits){
System.out.println(country);
}
这就导致了
England
Japan
Italy
Kenya
Mexico
此外,句子常常通过在每个" " (whitespace)`上进行分割而被分解成单词。正因为如此,人们对该方法的普遍理解是,它在某个字符上进行分割--但在这里也有可能获得创造性。
*replaceFirst()和replaceAll()*方法
Matcher 类不仅可以匹配 - 它可以用来替换字符串的某些部分,通过正则表达式找到。
为此,你可以使用String类的短语replaceFirst() 和replaceAll() 方法,该方法调用Matcher (该方法反过来调用String方法...)来修改一个String,在给定序列的第一次(或所有)出现时进行匹配。
这两个方法都接受RegEx和替换的String--replaceFirst() ,用替换的String替换该序列的第一次出现,而replaceAll() 方法则替换所有出现的字符。
String string = "Python is a general-purpose programming language. With Python, you can opt to create...";
string = string.replaceAll("Python", "Jaffa");
System.out.println(string);
string = string.replaceFirst("Jaffa", "Java");
System.out.println(string);
这两个方法都返回一个新的String 对象,所以一定要把它分配给一个新的参考变量,或者是你已经得到的同一个变量。在第一次调用println() 时,我们会将两个"Python" 序列变成"Jaffa" ,而在第二次调用println() 时,我们会将第一个"Jaffa" 变成"Java" 。
Jaffa is a general-purpose programming language. With Jaffa, you can opt to create...
Java is a general-purpose programming language. With Jaffa, you can opt to create...
结论
在这个简短的指南中,我们看了一下Java中字符串类的内置RegEx方法。
为了处理正则表达式,我们可以使用regex 包中的Pattern 和Matcher 类--不过,对于字符串的许多日常使用情况,你可以通过使用内置方法来避免模板。
这些方法最终使用的是regex 包,因此可以期待同样的性能和结果。