0

問題:

Java では、スクリプトを解析し、で始まるファイルからテキストを抽出します。

    ${GLOBAL_} or ${AUTO_}

最後の中括弧まですべてをピックアップしたいので、たとえば、次の文字列があるとします。

    "this is a String ${AUTO_TEST_f} body ${GLOBAL_SYNC} ${AUTO_2} ${OTHER_VAR}"

結果は次のようになります。

${AUTO_TEST_f} 

${GLOBAL_SYNC}

${AUTO_2} 

私が試みたこと:

私は正規表現パターンを作成しようとしました(うまくいくと思います)。それらを使用してMatcherを作成しました。次に、Matcher を使用してすべての一致をコンソールに出力しようとしましたが、いくつかの問題が発生しています。何らかの理由で、${GLOBAL_VARIABLE_1} をスキップしています。また、これを実装してすべての一致を取得するにはどうすればよいですか? while ループ [while match.group(0) != null]?

これが私のコードです:

 String re1="(\\$)";    // Any Single Character 1
String re2="(\\{)"; // Any Single Character 2
String re3="(G)";   // Any Single Character 3
String re4="(L)";   // Any Single Character 4
String re5="(O)";   // Any Single Character 5
String re6="(B)";   // Any Single Character 6
String re7="(A)";   // Any Single Character 7
String re8="(L)";   // Any Single Character 8
String re9="(_)";   // Any Single Character 9
String re10="(.*?)";    // Any Single Character 10
String re11="(\\})";    // Any Single Character 11


String r1="(\\$)";  // Any Single Character 1
String r2="(\\{)";  // Any Single Character 2
String r3="(A)";    // Any Single Character 3
String r4="(U)";    // Any Single Character 4
String r5="(T)";    // Any Single Character 5
String r6="(O)";    // Any Single Character 6
String r7="(_)";    // Any Single Character 7
String r8="(.*?)";  // Any Single Character 8
String r9="(\\})";  // Any Single Character 9

Pattern p = Pattern.compile((re1+re2+re3+re4+re5+re6+re7+re8+re9+re10+re11));
Pattern p2 = Pattern.compile(r1+r2+r3+r4+r5+r6+r7+r8+r9);

 Matcher m = p.matcher(txt);
 Matcher m1 = p2.matcher(txt);
 m1.find();
 System.out.println(m1.group(0));
 m.find();
 System.out.println(m.group(0));

そして、これはコンソールの結果です:

 Actual Results:
 ${AUTO_1}
 ${GLOBAL_VARIABLE_2}

これが私の期待される結果です:

 Expected Results:
 ${GLOBAL_VARIABLE_1}
 ${AUTO_1}
 ${GLOBAL_VARIABLE_2}
 ${GLOBAL_VARIABLE_3}

ありがとう!

4

3 に答える 3

4

複雑にしないでください:

String txt = "this is a String ${AUTO_TEST_f} body ${GLOBAL_SYNC} ${AUTO_2}";
String regex = "\\$\\{(AUTO|GLOBAL)_(.*?)\\}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(txt);
while (matcher.find()) {
    System.out.println(matcher.group() + "\t->\t" + matcher.group(2) + "\t(" + matcher.group(1) + ")" );
}

出力:

${AUTO_TEST_f}  ->  TEST_f  (AUTO)
${GLOBAL_SYNC}  ->  SYNC    (GLOBAL)
${AUTO_2}       ->  2       (AUTO)
于 2013-04-09T17:19:05.207 に答える
1

何をしていても、それは正しいコーディング方法ではありません。より小さなコンポーネントから正規表現を構成することは問題ありませんが、コンポーネントを 1 文字に分解すると意味がありません。

GLOBALまたはで始まるものを取得したい場合AUTOは、次のように簡単です。

\$\{(GLOBAL|AUTO)_.*?\}

正規表現を文字列リテラルに入れる:

"\\$\\{(GLOBAL|AUTO)_.*?\\}"
于 2013-04-09T17:16:14.583 に答える
1

これを試してください:

String data = "this is a String ${AUTO_TEST_f} body ${GLOBAL_SYNC} ${AUTO_2}";
    Pattern pattern = Pattern.compile("\\$\\{.+?\\}");

    Matcher matcher = pattern.matcher(data);

    while (matcher.find()) {
        // Indicates match is found. Do further processing
        System.out.println(matcher.group());
    }

出力は次のとおりです。

${AUTO_TEST_f}
${GLOBAL_SYNC}
${AUTO_2}

于 2013-04-09T17:14:45.247 に答える