1

Java の割り当ての一環として、特定の市外局番を持つすべてのレコードを選択する必要があります。ArrayListのような内にカスタム オブジェクトがありますArrayList<Foo>

各オブジェクトには String 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

次の 2 つのオプションがあります。

  1. またはvalue.startsWith("(616)")
  2. このパターンで正規表現を使用する"^\(616\).*"

最初のオプションははるかに高速です。

于 2013-03-12T20:42:58.750 に答える
1

必要なのはキャプチャグループだと思います。このドキュメントの「グループとキャプチャ」セクションをご覧ください。

入力とパターン(たとえば)の照合が完了したら、 (のオブジェクト)と"\((\\d+)\) \\d+-\\d+"を使用して括弧内の数値を取得できます。matcherjava.util.regex.Matchermatcher.group(1)

于 2013-03-12T20:37:50.503 に答える
1

areaCode = number.substring(number.indexOf('(') + 1, number.indexOf(')')).trim()あなたが持っている電話番号のフォーマットを考えると、あなたのために仕事をするべきです。

または、余分なスペースがない場合は、単に使用してareaCode = number.substring(1, 4)ください。

于 2013-03-12T20:36:45.150 に答える
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 に答える