3

以下の文字列を解析するための、文字列の一致以外のより簡単な方法はありますか? :

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23
    [name=Sprint 1,
     closed=true,
     startDate=2013-04-10T17:58:49.228-07:00,
     endDate=2013-04-24T17:58:49.228-07:00,
     completeDate=2013-04-16T14:42:09.504-07:00,id=10]

nameclosedおよびその他のそのような値を取得することに興味があります。

(この文字列は、JIRA から取得した JSONArray type の要素org.codehaus.jettison.json.JSONArrayです。)

4

4 に答える 4

1

この文字列はどこから取得しますか? この出力は、実装に非常によく似ていtoString()ます。この JSONArray オブジェクトへの参照はありますか? もしそうなら:

APIによると、オブジェクトは などのメソッドを提供しますgetString(int index)

したがってsprintObject.getString(0)、戻る必要がありますSprint 1

于 2013-07-12T20:25:24.413 に答える
1

したがって、これは有効な JSON ではない可能性がありますが、フォームが毎回同じである場合 (余分なネスト レベルがないという点で)、正規表現で解析できるはずです。

最初にこの正規表現を使用して配列をキャプチャし\[(.*)\]ます。中央のグループがデータになります。次に、そのデータを で分割します,。これで、選択した正規表現によって各エントリを簡単に解析できる配列ができました。エントリが、あなたが私たちに伝えていない、または私がキャッチしていない何らかの形式に従っていない限り、各エントリには独自の特定の正規表現が必要です。これは比較的書きやすいはずです。

また、最初の部分が

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23

重要なデータでしたが、別の正規表現で解析することもできます

解決策 2

したがって、別のソリューションでは、2 つの正規表現操作を使用して文字列を有効な JSON に変換します。

初め String result = searchText.replaceAll("(.|\\n)*(\\[(.|\\n)*\\])", "$1");'\

これは基本的に、その大きな文字列を前面から削除するだけです.

result = searchText.replaceAll("(\\w*)=([^,\\]]*)", "\"$1\" : \"$2\"");

この正規表現は配列を修正して有効な JSON 配列にするだけで、文字列に対して JSON パーサーを使用できるようになりました。あなたのソリューションで正規表現を使用しないことについては、正規表現はプログラミングで最も表現力のあるツールの1つであり、一部の人々はそれらを使いすぎていますが、これは1つを使用するのに最適なケースです

于 2013-07-12T20:22:01.163 に答える
0

'=' と ',' の間の出現を一致させるために正規表現を使用できると思います。プロパティ名、クローズドなどが常にその順序で存在し、'='、',' および '] を含まないことがわかっていると仮定します。 ' を値に含めます。

Pattern p = Pattern.compile("=.*?[,\\]]");
List<String> matches = new ArrayList<String>();
Matcher matcher = p.matcher(value);
while(matcher.find()) {
    matches.add(matcher.group(0));
}

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23[name=Sprint 1,closed=true,startDate=2013-04-10T17:58:49.228-07:00,endDate=2013-04-24T17:58:49.228 -07:00,completeDate=2013-04-16T14:42:09.504-07:00,id=10]

サンプルの一致に基づいて、次の文字列が含まれるようになりました。

  • name=スプリント 1,
  • 閉鎖=真、
  • startDate=2013-04-10T17:58:49.228-07:00,
  • endDate=2013-04-24T17:58:49.228-07:00,
  • completeDate=2013-04-16T14:42:09.504-07:00,
  • ID=10]

あなたはここからそれを取ることができると思います。

編集:正規表現が良いアプローチであるかどうかにかかわらず、このデータ形式は次のようなものからの戻り値によく似ています

public String toString() {
    return super.toString() + ... ;
}

また、考え直して、この形式を解析する以外に本当に別のオプションがない場合は、プロパティを明示的に照合します。たとえば、名前に正規表現「name=.*?」を使用します。

于 2013-07-12T20:28:20.007 に答える