oracle regex_like函数在java中失败

时间:2018-02-11 12:50:11

标签: java regex oracle jdbctemplate

我有一个查询需要使用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:发帖时遇到一些问题,我正在添加正则表达式作为标记,所以无法添加它。

3 个答案:

答案 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));

        }