繁体   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