我有一个查询需要使用regex_like(user_id,' ^。+ EMP \ d?$')。 它从我的SQLDeveloper完美地工作,并给我所需的结果。
但是当我通过java中的jdbcTemplate触发此查询时,
我收到编译时错误:Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \
\ )
以下行。
public static final String USER_IDENTIFIER = '^.+EMP\d?$'
为了解决这个问题,我在正则表达式中添加了一个反斜杠
'^.+EMP\\d?$'
。但这并没有给我想要的结果。事实上,这并没有给我任何结果。
我该如何解决这个问题?
任何线索都将受到赞赏。
P.S:发帖时遇到一些问题,我正在添加正则表达式作为标记,所以无法添加它。
答案 0 :(得分:1)
\d
是数字的字符类。试试这个怎么样?
'^.+EMP[0-9]?$'
此外,正则表达式匹配字符串中的任何位置,因此^.+
非常冗余。我猜这已经足够了:
'EMP[0-9]?$'
但这几乎肯定等同于你的表达:
'.EMP[0-9]?$'
如果您使用.
来避免换行,那么(当然)您的原文正确而简洁。
答案 1 :(得分:1)
在java中,转义序列是一个反斜杠字符后跟一个字母,例如\d
是换行符的转义序列。因此java认为\\d
意味着是一个转义序列。为了告诉java它不是转义序列,您需要编写java.util.regex.Pattern
。类\d
的 javadoc 解释了这一点。
当然,Oracle SQL不是java,因此在SQL中,{{1}}是可以接受的。
答案 2 :(得分:0)
使用单引号引用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));
}