1

对于我的 Java 作业的一部分,我需要选择所有具有特定区号的记录。我在 中 有自定义对象ArrayList,例如ArrayList<Foo>.

每个对象都有一个字符串 phoneNumber 变量。它们的格式类似于“(555) 555-5555”

我的目标是搜索ArrayList<Foo>(调用它listOfFoos)中的每个自定义对象,并将区域代码为“616”的对象放在temporaryListOfFoos ArrayList<Foo>.

我研究了分词器,但无法使语法正确。我觉得我需要做的与这篇文章类似,但由于我只尝试检索前 3 位数字(我不关心剩下的 7 位),所以这真的没有给我确切的信息正在寻找。使用字符串标记器忽略括号?

作为临时解决方法,我所做的是...

for (int i = 0; i<listOfFoos.size();i++){
  if (listOfFoos.get(i).getPhoneNumber().contains("616")){
    tempListOfFoos.add(listOfFoos.get(i));
  }
}

这适用于我们当前的数据集,但是,如果电话号码中的其他任何地方有 616 [如“(555) 616-5555”],它显然无法正常工作。

如果有人可以就如何只检索前 3 位数字而忽略括号给我建议,我将不胜感激。

4

4 回答 4

2

你有两个选择:

  1. 使用value.startsWith("(616)")或,
  2. 使用此模式的正则表达式"^\(616\).*"

第一个选项会快很多。

于 2013-03-12T20:42:58.750 回答
1

areaCode = number.substring(number.indexOf('(') + 1, number.indexOf(')')).trim()鉴于您拥有的电话号码格式,应该为您完成这项工作。

或者,如果您没有任何多余的空格,只需使用areaCode = number.substring(1, 4).

于 2013-03-12T20:36:45.150 回答
1

我认为您需要的是一个捕获组。查看本文档中的组和捕获部分。

完成将输入与模式(例如 )匹配后,您可以使用带有 的(object of )"\((\\d+)\) \\d+-\\d+"获取括号中的数字。matcherjava.util.regex.Matchermatcher.group(1)

于 2013-03-12T20:37:50.503 回答
0

您可以使用如下所示的正则表达式。该模式将确保整个电话号码符合您的模式 ( (XXX) XXX-XXXX ) 并抓取括号内的号码。

int areaCodeToSearch = 555;
String pattern = String.format("\\((%d)\\) \\d{3}-\\d{4}", areaCodeToSearch);

Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(phoneNumber);
if (m.matches()) {
  String areaCode = m.group(1);
  // ...
}

您是否选择使用正则表达式与简单的字符串查找(如其他答案中所述)将取决于您对整个字符串格式的困扰程度。

于 2013-03-12T20:41:26.410 回答