Java中带有双反斜杠的正则表达式 - 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\\}";包含双反斜杠?

参考方案

通常,不需要在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'

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java:找到特定字符并获取子字符串 - java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

Java Scanner读取文件的奇怪行为 - java

因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

在Java中使用新关键字和直接赋值的字符串 - java

String s="hi"; String s1=new String("hi"); 从内存角度看,s和s1存储在哪里?无论是在堆内存还是堆栈中。s指向“ hi”,而s1指向hi存在的内存位置?请帮忙? 参考方案 考虑以下 String s = "hi"; String s1 = new Strin…

Java string.hashcode()提供不同的值 - java

我已经在这个问题上停留了几个小时。我已经注释掉所有代码,认为这与数组超出范围有关,但是这种情况仍在发生。我正在尝试使用扫描仪从文件中读取输入,存储数据并稍后使用哈希码获取该数据。但是哈希值不断变化。public static void main(String[] args) { //only prior code is to access data char…