Javaで二重のバックスラッシュと正規表現

user812142:

私は以下のコードでの正規表現の概念を理解したいです。

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\\}";二重のバックスラッシュが含まれていますか?

DPR:

$そして{、一般的に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'

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222963&siteId=1