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上查看。