1

入力は次のようなものです。

String text = "{\"definitions\":[{\"id\":\"com.sample.evaluationa\",\"name\":\"Evaluationa\",\"vers}{\"id\":\"com.sample.evaluationb\",\"name\":\"Evaluationb\",\"vers}";

そしてそれをより透明にするためのいくつかの引用

String definitions = "{\"definitions\":[";
String id = "{\"id\":\"";
String name = "\",\"name\":\"";
String rest = "\",\"vers}";

私の正規表現は次のようになります。

Pattern pattern = Pattern.compile((Pattern.quote(definitions)) +"("+ (Pattern.quote(id)) +"(.+)" +(Pattern.quote(name))+"(.+)"+(Pattern.quote(rest))+")*");

IDを探しています(com.sample.evaluation)

Matcher regexMatcher = pattern.matcher(text);
    while (regexMatcher.find()) {
        title = regexMatcher.group(2);
        System.out.println(title);
        System.out.println("The pattern is " + pattern.pattern());
    }

私の出力は次のようになります。

com.sample.evaluationa","name":"Evaluationa","vers}{"id":"com.sample.evaluationb
The pattern is \Q{"definitions":[\E(\Q{"id":"\E(.+)\Q","name":"\E(.+)\Q","vers}\E)*

でも私はしたい:

com.sample.evaluationacom.sample.evluationb

そして、サイクルでターゲットグループを変更した後、何も興味深いですが、良い方法ではありません

title = regexMatcher.group(2);

私はちょうど(そしてもちろんパターンライン)を取得します

Evaluationb
4

2 に答える 2

1

.+1から無限の文字を意味し、正規表現エンジンはデフォルトで貪欲であるため、可能な限り多くの文字に一致します。

そこで期待できる文字のクラスを定義することをお勧めします。最後のクラスの一部ではないため、正規表現エンジンを押すと停止する
[a-z\.]+ためid 、 それらは単独で機能します。[A-Z][a-z]+name
\\

何らかの理由で使用したい.+が、できるだけ早く停止する場合は、後を追加して、怠惰な?動作に切り替えます。(例).+?

于 2013-03-07T03:52:08.513 に答える
0

その文字列をJavaで処理できます。Apachecommonslangcommons-lang3-3.1.jarライブラリをダウンロードして、ファイルをlibsフォルダーに貼り付ける だけです。

そして、このように使用します

String formatedjsonstring=StringEscapeUtils.unescapeJava(yourjsonstring);

物事を複雑にしないでください..文字を自動的にエスケープ解除するこのライブラリを使用してください

Javaをエスケープした後、キャラクターは次のようなJsonオブジェクトを作成します

JSONObject obj=new JSONObject(formatedjsonstring);
JSONArray jsonArray=obj.getJSONArray("definitions");

それらのjsonオブジェクトを解析するためのforループを使用するより

for(int i=0;i<jsonArray.length();i++)
{
JSONObject obj=jsonArray.getJSONObject(i);
String id=obj.getString("id");
}
于 2013-03-07T05:16:03.800 に答える