对于我的部分Java分配,我需要选择具有特定区域代码的所有记录。我在ArrayList
中有自定义对象,例如ArrayList<Foo>
。
每个对象都有一个String phoneNumber变量。它们的格式如“(555)555-5555”
我的目标是搜索ArrayList<Foo>
中的每个自定义对象(称之为listOfFoos
),并将区号为“616”的对象放入temporaryListOfFoos
ArrayList<Foo>
我查看过tokenizer,但无法正确识别语法。我觉得我需要做的就是这个帖子,但是因为我只想检索前3位数(而且我不关心剩下的7位数),这真的不能给我到底是什么我正在寻找。 Ignore parentheses with string tokenizer?
我作为临时解决方案所做的是......
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位数而给我建议,而忽略括号,我会非常感激。
答案 0 :(得分:2)
您有两种选择:
value.startsWith("(616)")
或,"^\(616\).*"
第一个选项会更快。
答案 1 :(得分:1)
areaCode = number.substring(number.indexOf('(') + 1, number.indexOf(')')).trim()
应该为您完成这项工作。
或者,如果您没有任何无关的空格,只需使用areaCode = number.substring(1, 4)
。
答案 2 :(得分:1)
我认为您需要的是捕获组。请查看此document中的群组和捕获部分。
完成输入与模式匹配后(例如"\((\\d+)\) \\d+-\\d+"
),您可以使用matcher
(java.util.regex.Matcher
的对象)和{{matcher.group(1)
来获取括号中的数字1}}。
答案 3 :(得分: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);
// ...
}
您是否选择使用正则表达式而不是简单的字符串查找(如其他答案中所述)将取决于您对整个字符串格式的困扰。