簡體   English   中英

Java中帶有雙反斜杠的正則表達式

[英]Regular Expressions with double backslash in java

我想在以下代碼中了解正則表達式的概念:

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\\\\}"; 包含雙反斜線?

$"$"是美元符號/包含它的字符串。
\\$是轉義的美元符號,通常在原始正則表達式中找到,如果您想匹配char $而不是行尾
"\\\\$"是一個包含轉義\\的字符串,后跟法線$ 由於您不是在編寫原始正則表達式,而是正則表達式位於Java String您需要對\\進行轉義,以便當正則表達式解釋器出現時,它只會看到一個普通\\ ,然后將其視為轉義以下$

"\\$"無效,因為從正常的String角度來看, $沒什么特別的,不需要/一定不能轉義。

通常,不需要在Java字符串文字中對${進行轉義,但在正則表達式中則需要對它們進行轉義,因為它們在正則表達式中具有特殊含義。 $匹配行尾, {用於匹配字符一定次數。 為了匹配任何正則表達式特殊字符本身,這些字符需要轉義。 例如, A{5}匹配AAAAAA\\{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"); 匹配SQL_INSERT${table}的第一個匹配項,並將此匹配項替換為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'

我想了解如何。

它用"tableName"替換了正則表達式"\\\\$\\\\{table\\\\}"中原始字符串"INSERT INTO ${table}(${keys}) VALUES(${values})"的第一個匹配"INSERT INTO ${table}(${keys}) VALUES(${values})"

$和{符號應在Java字符串中使用反斜杠轉義,但在上述字符串中沒有反斜杠,如果我嘗試添加反斜杠,則會顯示錯誤:無效的轉義序列。

不, ${}不能在Java字符串中轉義,為什么呢?

還有為什么TABLE_REGEX =“ \\ $ \\ {table \\}”; 包含雙反斜線?

在Java中,轉義由雙反斜杠完成,因為單反斜杠表示特殊字符(例如\\n\\t )。 它轉義了${}符號,因為這些符號在正則表達式中具有特殊含義,因此轉義它們會告訴Java regex引擎將它們按字面意義視為這些符號,而不是其特殊含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM