利用Java内置字符串正则表达式(RegEx)的方法

65 阅读4分钟

**正则表达式(RegEx)**是一个强大的工具,帮助我们以灵活、动态和高效的方式匹配模式,并根据结果进行操作。

在这个简短的指南中,我们将看看内置的RegEx方法,它是String类的一部分,使我们能够避免使用PatternMatcher 类的麻烦。

标准Java API中的regex 包已经向我们介绍了PatternMatcher 类,我们可以用它们来表示正则表达式并检查是否匹配。不过,这需要创建和使用两个额外的对象--虽然工作得很好,但有点啰嗦,也没有必要。

客户端非常需要一个更干净、更优雅的解决方案,用于简单的匹配,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 包中的PatternMatcher 类--不过,对于字符串的许多日常使用情况,你可以通过使用内置方法来避免模板。

这些方法最终使用的是regex 包,因此可以期待同样的性能和结果。