**正则表达式(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
包,因此可以期待同样的性能和结果。