1. 概述

在这个教程中,我们将学习如何从正则表达式(regex)输出创建数组。

2. 引言

以我们的示例为例,我们将解析一个长字符串,查找其中包含的10位电话号码模式。然后,我们将输出生成为数组。

Oracle提供了java.util.regex包来实现正则表达式。我们将使用这个包中的类来进行演示。找到匹配项后,我们将把输出转换为数组。

数组是固定大小的变量,我们必须在使用它们之前声明其大小。如果不正确地实现数组,可能会造成内存浪费。因此,我们首先使用List,然后动态地将其转换为数组。

3. 实现

让我们逐步通过代码来实现这个解决方案。首先,我们创建一个ArrayList来存储匹配项:

List<String> matchesList = new ArrayList<String>();

我们将存储一个嵌入了电话号码的长字符串,如下所示:

String stringToSearch =
  "7801111111blahblah  780222222 mumbojumbo7803333333 thisnthat 7804444444";

我们使用Pattern类的静态工厂方法compile(),它返回一个等效的Pattern对象,对应于给定的正则表达式:

Pattern p1 = Pattern.compile("780{1}\\d{7}");

一旦我们有了Pattern对象,我们可以使用matcher()方法创建一个Matcher对象:

Matcher m1 = p1.matcher(stringToSearch); 

在这里,我们可以使用Matcher类的find()方法,它会返回一个boolean值,表示是否找到了匹配:

while (m1.find()) {
    matchesList.add(m1.group());
}

我们刚刚使用的group()方法也在Matcher类中。它会产生一个代表匹配模式的String

为了将matchesList转换为数组,我们需要找出匹配的数量。然后,在创建新数组时使用这个数量来存储结果:

int sizeOfNewArray = matchesList.size(); 
String newArrayOfMatches[] = new String[sizeOfNewArray]; 
matchesList.toArray(newArrayOfMatches);

现在,让我们看看我们的代码如何与一些例子一起工作。如果我们传递一个包含四个匹配模式的String,我们的代码将产生一个新的String数组,包含这四个匹配项:

RegexMatches rm = new RegexMatches();
String actual[] = rm.regexMatch("7801111211fsdafasdfa  7802222222  sadfsadfsda7803333333 sadfdasfasd 7804444444");

assertArrayEquals(new String[] {"7801111211", "7802222222", "7803333333", "7804444444"}, actual, "success");

如果我们传递一个没有匹配项的String,我们将得到一个空的String数组:

String actual[] = rm.regexMatch("78011111fsdafasdfa  780222222  sadfsadfsda78033333 sadfdasfasd 7804444");

assertArrayEquals(new String[] {}, actual, "success");

4. 总结

在这篇教程中,我们学习了如何在Java中查找文本字符串中的模式。我们也找到了一种将输出存储在数组中的方法。

源代码可在GitHub上查看。