私は以下のコードでの正規表現の概念を理解したいです。
private static final String SQL_INSERT = "INSERT INTO ${table}(${keys})
VALUES(${values})";
private static final String TABLE_REGEX = "\\$\\{table\\}";
.
.
.
String query = SQL_INSERT.replaceFirst(TABLE_REGEX, "tableName");
上記のコードは正常に動作しているが、私はどのように理解したいと思います。私の知識あたりとして$と{記号は、バックスラッシュを使用してJava文字列にエスケープする必要がありますが、上記の文字列にそこにはバックスラッシュはありませんし、私はそれを追加しようとした場合、それはエラーを示しています。無効なエスケープシーケンス。
また、なぜTABLE_REGEX = "\\$\\{table\\}";
二重のバックスラッシュが含まれていますか?
$
そして{
、一般的にJavaの文字列リテラルにエスケープする必要がありますが、正規表現で、彼らは正規表現で特別な意味を持つようにエスケープする必要はありません。$
行の末尾に一致し、{
文字を何回の一定量を一致させるために使用されます。正規表現の特殊文字自体を一致させるには、これらの文字をエスケープする必要があります。たとえばA{5}
マッチAAAAA
けどA\{5
試合A{5
。
あなたが使用して正規表現文字列で何かをエスケープするには\
。しかし、文字列リテラル内のバックスラッシュ自体は別で行われるエスケープを必要とします\
。それは文字列リテラルで"\\{"
、実際に文字列に対応します"\{"
。
正規表現文字列リテラルにあなたは多くの場合、複数のバックスラッシュに遭遇するのはこのためです。あなたはまたで見て取りたいかもしれないPattern.quote(String s)
文字列をとり、適切にすべての特殊文字(WRT。Javaの正規表現を)逃げるの。
基本的にはなく、
private static final String TABLE_REGEX = "\\$\\{table\\}";
あなたが書くことができます
private static final String TABLE_REGEX = Pattern.quote("${table}");
あなたの例でSQL_INSERT.replaceFirst(TABLE_REGEX, "tableName");
の最初の出現と一致する${table}
でをSQL_INSERT
してて、この発生を置き換えますtableName
:
String sql = "INSERT INTO ${table}(${keys}) VALUES(${values})".replaceFirst("\\$\\{table\\}", "tableName");
boolean test = sql.equals("INSERT INTO tableName(${keys}) VALUES(${values})");
System.out.println(test); // will print 'true'