Contents

Java数组中正则表达式匹配

1. 概述

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

2. 简介

对于我们的示例,让我们解析一个长字符串。我们将找到具有 10 位电话号码的模式。然后我们将输出生成为一个数组。

Oracle为其正则表达式实现提供了java.util.regex包。我们将使用此包中可用的类进行演示。找到匹配项后,我们将获取该输出并创建一个数组。

数组是固定大小的变量。我们必须在使用它们之前声明它们的大小。如果数组没有正确实现,也有可能浪费内存。出于这个原因,我们从List开始,然后将List动态转换为数组。

3. 实施

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

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

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

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

我们使用compile()方法,Pattern 类中的静态工厂方法。它返回一个等价 的正则表达式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");