3

次のような情報の動的入力の例があります。

Xbox 360(黒)エリートコンソール120GB(メイソンシティイリノイ)$ 200

$ 200 2013 North Trail Camper(RT202。メイン州マンチェスター)$224/月。

スノーモービルバイクトレーラー(ウィンスロップ/オーガスタ)月額$ 40

「グレートクリスマスギフト」XBox360ギターヒーロー(Springfied)

Androidで正規表現を使用して文字列を3つの部分に分割しようとしています。

  1. XXX()の前のテキスト
  2. (XXX)のテキスト
  3. ()XXXの後のテキスト

()内の場所の後のテキストである価格がない場合があります。

私はしようとしました

Pattern p = Pattern.compile("\(([^]*)\)");
Matcher m = p.matcher(title);

しかし、Androidでマッチャーを動作させることはできません。で調べると、常に空になりますmatcher.group(1)。私は現在、どちらかを探すように設定しています(または、$と爆発も別々の文字列を取得します。しかし、これは不正確で非効率的です。

どんな助けも必要です!

4

4 に答える 4

4

正規表現でこれを行うことができると思いますが、そうしない方が簡単かもしれません。

    String input[] = {
            "Xbox 360 (black) Elite Console 120GB (Mason City Illinois ) $200",
            "$200 2013 North Trail Camper (RT 202. Manchester, Maine) $224/mo.",
            "Snowmobile Bike trailers (Winthrop / Augusta) $40 Monthly",
            "\"Great Xmas Gift\" XBox 360 Guitar Hero (Springfied)"
    };
    for (String s : input) {
        int lastClose = s.lastIndexOf(')');
        int lastOpen = s.lastIndexOf('(', lastClose);
        System.out.println(s.substring(0, lastOpen).trim() +
                "~" + s.substring(lastOpen + 1, lastClose).trim() +
                "~" + s.substring(lastClose + 1).trim());
    }

プリント

Xbox 360 (black) Elite Console 120GB~Mason City Illinois~$200
$200 2013 North Trail Camper~RT 202. Manchester, Maine~$224/mo.
Snowmobile Bike trailers~Winthrop / Augusta~$40 Monthly
"Great Xmas Gift" XBox 360 Guitar Hero~Springfied~
于 2012-12-19T18:05:49.863 に答える
1

[編集]この問題には正規表現を使用しません。代わりに、このメソッドを使用して、最後の文字と文字String#lastIndexOf(...)の境界を見つけ、それらの値から部分文字列を返します。()

public static String[] splitParens(String s) { 
  if (s == null) return null;
  int indexOfLastOpenParen = s.lastIndexOf('(');
  int indexOfLastCloseParen = s.lastIndexOf(')');
  return new String[] { 
    s.substring(0, indexOfLastOpenParen),
    s.substring(indexOfLastOpenParen + 1, indexOfLastCloseParen),
    s.substring(indexOfLastCloseParen + 1)
  };
} 
public static void main(String args[]) throws Exception { 
  String input[] = { 
    "Xbox 360 (black) Elite Console 120GB (Mason City Illinois ) $200",
    "$200 2013 North Trail Camper (RT 202. Manchester, Maine) $224/mo.",
    "Snowmobile Bike trailers (Winthrop / Augusta) $40 Monthly",
    "\"Great Xmas Gift\" XBox 360 Guitar Hero (Springfied)"
  };
  Pattern p = Pattern.compile("\\(([^\\)]+)\\)");
  for (String s : input) { 
    System.out.println(Arrays.asList(splitParens(s)));
  }
  // =>
  // [Xbox 360 (black) Elite Console 120GB , Mason City Illinois ,  $200]
  // [$200 2013 North Trail Camper , RT 202. Manchester, Maine,  $224/mo.]
  // [Snowmobile Bike trailers , Winthrop / Augusta,  $40 Monthly]
  // ["Great Xmas Gift" XBox 360 Guitar Hero , Springfied, ]
}

もちろん、より多くのエラーチェックが必要です(たとえば、エラーがない場合はどうなります()?)。

于 2012-12-19T18:00:18.807 に答える
1

常に3つのグループが存在することが確実な場合は、この式が機能します。

(。*)\((。*)\)(。*)

ここで自分で試すことができます:

http://www.regexplanet.com/cookbook/ahJzfnJlZ2V4cGxhbmV0LWhyZHNyDgsSBlJlY2lwZRiU8y0M/index.html

于 2012-12-19T17:52:12.727 に答える
1

正規表現を使用する必要があるかどうかはわかりませんが、使用しない場合はString.splitを使用してください。次に、を使用"\\(|\\)"して文字列を括弧で分割し、作成された文字列配列からさまざまなセクションを取得できます。

于 2012-12-19T17:55:03.720 に答える