暴露的JetBrains(DSL Api):使用.regexp()时出现问题的情况

时间:2019-05-31 13:45:26

标签: regex kotlin orm kotlin-exposed javalin

我正在使用Javalin和Exposed ORM构建一个小型API。 我正在尝试在条件但条件抛出异常的情况下使用正则表达式,因为由于我的代码而执行的SQL查询似乎不完整(缺少模式)。

fun getUsersByFilter(filter: String): List<User> {
    val regex = StringBuilder("/")
            .append(filter.toLowerCase())
            .append("/i")
            .toString()


    /**
     * The .regexp(someString) method take a string as argument (a pattern)
     */
    val users = transaction {
        User.find{ Users.pseudo.regexp(regex)  }.toList()
    }

    return users
}
  Position : 141. Statement(s): SELECT users.id, users.pseudo, users.email, users."password", users.admin, users.created_at, users.updated_at FROM users WHERE users.pseudo REGEXP ?
org.jetbrains.exposed.exceptions.ExposedSQLException: org.postgresql.util.PSQLException: ERREUR: erreur de syntaxe sur ou près de « REGEXP »
  Position : 141
SQL: [SELECT users.id, users.pseudo, users.email, users."password", users.admin, users.created_at, users.updated_at FROM users WHERE users.pseudo REGEXP ?]

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

好吧,我明白了。即使使用StringBuilder时,regex参数也已正确传递给查询(异常消息中的问号正好指向该参数...)。该错误来自PostgreSQL,因为PostgreSQL中根本不存在“ REGEXP”功能...

我终于使用了这段代码:

    fun getUsersByFilter(filter: String): List<User> {
        val regex = "%${filter.toLowerCase()}%"

        val users = transaction {
            User.find{ Users.pseudo.lowerCase().like(regex) }.toList()
        }

        return users
    }

答案 1 :(得分:0)

在您的代码中,看起来好像您正在尝试通过将/,模式和/i分隔符+不区分大小写的标志连接在一起来从用户输入中创建正则表达式。

这是错误的,因为:

  • 在Kotlin(和Java)中,正则表达式模式是通过字符串文字而不是 regex 文字来指定的,JavaScript,PHP,Perl通常是这样,因此您无需添加{{1 }}两端
  • 不区分大小写可以使用特定的options/)来设置,或者更容易地使用内嵌修饰符(例如RegexOptions.IGNORE_CASE)来设置。首先添加它,整个正则表达式将不区分大小写。
  • 但是,如果用户部分包含特殊的正则表达式元字符,则应在字面上进行匹配的用户部分将引发异常。您需要对其“报价”,在Kotlin中,您需要使用Regex.fromLiteral method

所以,我建议使用

(?i)