Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle正则表达式类函数在java中失败_Java_Regex_Oracle_Jdbctemplate - Fatal编程技术网

oracle正则表达式类函数在java中失败

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?$”。

我确实有一个查询需要使用regex_like(user_id,“^.+EMP\d?$”)。 我的SQLDeveloper可以很好地运行它,并给我期望的结果

但当我通过java中的jdbcTemplate启动此查询时, 我收到编译时错误:
无效的转义序列(有效的是\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_标识符作为绑定变量传入),它不需要将单引号作为字符串的一部分。