我想在下面的代码中了解正则表达式的概念:
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\\}";
包含两个反斜杠?
答案 0 :(得分:4)
$
或"$"
是美元符号/包含它的字符串。
\$
是一个转义的美元符号,通常要在 raw 正则表达式中找到,如果您想匹配char $而不是行的末尾
"\\$"
是一个字符串,包含一个转义的\
和一个常规$
。由于您不是在编写 raw 正则表达式,而是正则表达式位于Java String
内部,因此您需要转义\
,以便当正则表达式解释器出现时,它只会看到一个普通\
,然后将其视为转义以下$
。
"\$"
无效,因为从正常的String
角度来看,$
没什么特别的,不需要/一定不能逃脱。
答案 1 :(得分:2)
$
和{
通常不需要在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'
答案 2 :(得分:1)
我想了解如何。
它将用"\\$\\{table\\}"
替换原始字符串"INSERT INTO ${table}(${keys}) VALUES(${values})"
中的正则表达式"tableName"
的第一个匹配项。
$和{符号应在Java字符串中转义 使用反斜杠,但在上面的字符串中没有反斜杠,如果我尝试 添加它,它显示错误:无效的转义序列。
不,${}
不能在Java字符串中转义,为什么要这么做?
也是为什么TABLE_REGEX =“ \ $ \ {table \}”;包含双 反斜杠?
在Java中,转义由双反斜杠完成,因为单反斜杠表示特殊字符(例如\n
,\t
)。之所以转义${}
符号是因为这些符号在正则表达式中具有特殊含义,因此转义它们会告诉Java regex引擎将它们按字面意义视为这些符号,而不是其特殊含义。