oracle正则表达式类函数在java中失败
我确实有一个查询需要使用regex_like(user_id,“^.+EMP\d?$”)。 我的SQLDeveloper可以很好地运行它,并给我期望的结果 但当我通过java中的jdbcTemplate启动此查询时, 我收到编译时错误:oracle正则表达式类函数在java中失败,java,regex,oracle,jdbctemplate,Java,Regex,Oracle,Jdbctemplate,我确实有一个查询需要使用regex_like(user_id,“^.+EMP\d?$”)。 我的SQLDeveloper可以很好地运行它,并给我期望的结果 但当我通过java中的jdbcTemplate启动此查询时, 我收到编译时错误:无效的转义序列(有效的是\b\t\n\f\r\“\”\ \)用于下一行 public static final String USER_IDENTIFIER='^.+EMP\d?$' 为了处理这个问题,我在正则表达式中添加了一个反斜杠 “^.+EMP\\d?$”。
无效的转义序列(有效的是\b\t\n\f\r\“\”\
\)
用于下一行
public static final String USER_IDENTIFIER='^.+EMP\d?$'
为了处理这个问题,我在正则表达式中添加了一个反斜杠
“^.+EMP\\d?$”
。但这并没有给我想要的结果。事实上,这并没有给我任何结果
我怎样才能解决这个问题
任何线索将不胜感激
附言:发帖时出现了一些问题,问题是我正在将regex添加为标记,因此无法添加它。
\d
是一个数字字符类。试试这个怎么样
'^.+EMP[0-9]?$'
此外,正则表达式在字符串中的任何位置都匹配,因此^.+
是非常冗余的。我猜这就足够了:
'EMP[0-9]?$'
但这几乎肯定等同于你的表达:
'.EMP[0-9]?$'
如果您使用
来避免换行,那么(当然)您的原文正确且简洁。在java中,转义序列是一个反斜杠字符,后跟一个字母,例如,\n
是换行符的转义序列。因此java认为\d
是转义序列。为了告诉java它不是转义序列,您需要编写\\d
类java.util.regex.Pattern的文档解释了这一点
当然,Oracle SQL不是java,因此在SQL中,\d
是可以接受的。用单引号引用java仅用于单字符
下面是一个功能正常的jdbc示例,您可以在其中看到带有正则表达式的setString
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XE","klrice","klrice");
PreparedStatement stmt = conn.prepareStatement(
"select * from user_tables " +
"where REGEXP_LIKE(table_name,?) ");
stmt.setString(1, "^.+EMP\\d?$"); // the string
ResultSet rset = stmt.executeQuery();
while( rset.next() ) {
System.out.println(rset.getString(1));
}
您可以添加示例数据和db版本号吗?我不知道Java,但从表面上看,它似乎不识别单引号作为标记文字字符串。也许Java使用双引号来括起字符串?不要担心Oracle使用什么;Oracle只需要字符串(如果您将USER_标识符作为绑定变量传入),它不需要将单引号作为字符串的一部分。