2

動的な長い文字列があります。%XXX%が見つかった場合は常に、XXX値を取得して、他の値に置き換える必要があります。複数の%XXX%があります。%%以内の値を取得するにはどうすればよいですか?

たとえば

"POLICY_NO = %POLNO%  and b.ACTION_TIME = (select max(ACTION_TIME) from POLICY_DETAILS where POLICY_NO = %POLICYID%)"

2の間の各値を読み取るにはどうすればよい%ですか?そして、POLNOを取得して、いくつかのセッション変数(たとえば、POLNO = 1234567、POLICYID = 3)と比較する必要があります。一致する場合は、セッション変数の値を置き換える必要があります。次に、クエリsholudは次のようになります

"POLICY_NO = 1234567 and b.ACTION_TIME =(select max(ACTION_TIME)from POLICY_DETAILS where POLICY_NO = 3)"

4

4 に答える 4

3

クラスメソッドメソッドを見てくださいString.format()。ただし、SQLの場合は、PreparedStatement標準のJavaクラスの使用を検討する必要があります。

String.formatの例を次に示します。

String formatted = String.format("%d is a number and %s is another string", 20, "Test");
System.out.println(formatted);
于 2012-04-26T11:13:56.010 に答える
3

Patternとを使用しMatcherて、2パーセント文字(%)の間のすべての文字列を取得できます。これには、次の式を試してください。%([^%]*)%

見つけた文字列を評価する必要があります。

または、ここで何が発生する可能性があるか(または何をサポートする必要があるか)がわかっている場合は、を使用してsomeString.replace("%POLNO%", "somevalue")ください。

ただし、これがSQLの場合は、代わりにプリペアドステートメント(一部の拡張機能を含む)またはORマッパーを調べることをお勧めします。その場合、基本的に持っているのはパラメータという名前です。

于 2012-04-26T11:17:38.147 に答える
3

文字列の置換のみを考慮します。

  • 置き換える必要のある変数やその値がわからない場合は、次のように実行できます。

    // Map simulate your session variables.
    Map<String, String> variables = new HashMap<String, String>();
    variables.put("POLNO", "V1");
    variables.put("POLICYID", "V2");
    
    String input =
    /**/"POLICY_NO = %POLNO% and A.POLICY_DETAILS_ID = " +
    /**/"b.POLICY_DETAILS_ID and b.ACTION_TIME = " +
    /**/"(select max(ACTION_TIME) from POLICY_DETAILS " +
    /**/"where POLICY_NO = %POLICYID%)";
    
    StringBuilder output = new StringBuilder(input);
    
    int offset = 0;
    
    Matcher matcher = Pattern.compile("(%)([^%]*)(%)").matcher(input);
    while (matcher.find()) {
        // Get only second group (variable name), ignoring % symbols
        String variable = matcher.group(2);
        String value = variables.get(variable);
    
        // Calculate the offset.
        // The previous replaces can change the string length
        int start = matcher.start() + offset;
        int end = matcher.end() + offset;
    
        // Replace %XXX% by its value
        output.replace(start, end, value);
    
        offset -= variable.length() + 2 - value.length();
    }
    
  • それ以外の場合は、乗算呼び出しを連鎖させることができます。

    String.replace("%XXX%", "VALUE")
    
于 2012-04-26T12:25:06.217 に答える
2

PreparedStatementSQLインジェクションを防ぐために使用する必要があることに同意します。

ただし、Stringで置換を行うことにした場合は、正常にappendReplacement機能します。

final String in = "POLICY_NO = %POLNO% and A.POLICY_DETAILS_ID = b.POLICY_DETAILS_ID and b.ACTION_TIME = (select max(ACTION_TIME) from POLICY_DETAILS where POLICY_NO = %POLICYID%)";

// initialize map
final Map<String, String> map = new HashMap<String, String>();
map.put( "POLNO", "1234567" );
map.put( "POLICYID", "3" );

final Pattern pattern = Pattern.compile( "%.*?%" );
final Matcher matcher = pattern.matcher( in );
final StringBuffer sb = new StringBuffer();
while ( matcher.find() ) {
    final String found = matcher.group();
    final String withoutPercents = found.substring( 1, found.length() - 1 );
    matcher.appendReplacement( sb, map.get( withoutPercents ) );
    // instead of map.get(), there could be session.getAttribute( withoutPercents  )
}
matcher.appendTail( sb );
System.out.println( sb.toString() );

UPD:以下のコメントによると

于 2012-04-26T12:03:28.703 に答える