1

ユーザー入力からjava.lang.Stringオブジェクトを受け取り、JDBC SELECTステートメントを発行する JDBC ライブラリを作成しています。エスケープされていない%文字が存在すると、ライブラリが比較でLIKE句を使用するようになりますが、エスケープされていない%文字のない文字列の場合は、より厳密な=比較を使用する必要があります。

たとえば、次のテーブルとデータを使用します。

CREATE TABLE S (V CHARACTER VARYING);
INSERT INTO S (V) VALUES ('%B%'); -- row a
INSERT INTO S (V) VALUES ('%%%'); -- row b
INSERT INTO S (V) VALUES ('%%X'); -- row c

文字列"\%\%\%"* (エスケープされていない%文字を含まない) が次のクエリにつながるようにします。

SELECT * FROM S WHERE V = '%%%'

... 1 行 (行 b) のみに一致します。一方、文字列"\%%\%" (エスケープされていない%を 1 つ含む) は次のクエリにつながるはずです。

SELECT * FROM S WHERE V LIKE '\%%\%'

... 行 a と b のみに一致します (c には一致しません)。

エスケープされていない%文字に対してそのようなテストを行い、 =比較に必要なエスケープされていないバージョンを生成するユーティリティ クラスが Java にありますか(すべての%文字が最初にエスケープされている場合)。

ロジックは次のようになります。

 if ( unescapedPercentageExists( s ) )
     likeClause( s )
 else
     equalClause ( removeEscapes( s ) )
4

2 に答える 2

2

正規表現を試す

public static boolean unescapedPercentageExists(String s){
    return s.matches(".*((?<=[^\\\\])|^)%.*");
}

テスト:

abc: false
abc\%: false
\%abc: false
a\%bc: false
abc%: true
%abc: true
a%bc: true
于 2013-04-03T08:45:55.407 に答える