使用 UCanAccess 查询 Access 数据库时的正则表达式匹配


public TestDate()
{
    fnDbConnect();
    try
    {
        String sql = "SELECT ledate FROM tblTestDate WHERE (ledate REGEXP '^..........$')";
        resultSet = st.executeQuery(sql);
        while (resultSet.next())
        {
            String strr = resultSet.getString("ledate");
            System.out.println("strr: " + resultSet.getString("ledate"));
        }
            System.out.println("After");
        }
        catch(SQLException sqlException)
        {
            sqlException.printStackTrace();
            System.exit(1);
        }
        fnDbClose();
    }

在我的数据库中,我存储了如下值:11/12/1990、05/08/2001。正则表达式(我只是出于测试目的使用它)应该给我存储的所有内容。

我得到的错误:

net.ucanaccess.jdbc.UcanaccessSQLException:意外令牌:REGEXP 必需:)

是的,只需使用 LIKE 运算符:

select * from table1 where COLUMN1 like '^[a-zA-Z]#[a-zA-Z] #[a-zA-Z]#$';

(与在 Access 中一样,您可以使用#而不是d

我花了很多时间让这个隐藏的功能工作。

以下是更多示例: myTest

>UCanAccess 使用 HSQLDB 作为后备数据库,因此我们可以在针对 Access 数据库的 UCanAccess 查询中使用 HSQLDB 的 REGEXP_MATCHES() 函数。例如,以下查询查找加拿大邮政编码(例如"A1B 2C3")...

ResultSet rs = stmt.executeQuery(
        "SELECT PostalCode FROM Members " +
        "WHERE REGEXP_MATCHES(PostalCode, '^[a-zA-Z]\d[a-zA-Z] \d[a-zA-Z]\d$')";

。虽然,正如Marco在他的回答中指出的那样,UCanAccess也支持Access SQL的LIKE子句的类似正则表达式的功能,可用于完成同样的事情。

此外,通过UCanAccess,我们可以使用HSQLDB的REGEXP_SUBSTRING()函数根据模式从列中提取文本。以下代码从 [TextField] 中提取看起来像北美电话号码的第一个子字符串(例如,'416-555-1212' 或 '403-GOT-BEEF'):

ResultSet rs = stmt.executeQuery(
        "SELECT phone " +
        "FROM " +
        "( " +
            "SELECT REGEXP_SUBSTRING(TextField, '\d{3}-\w{3}-\w{4}') AS phone " +
            "FROM Table1 " +
        ") " +
        "WHERE phone IS NOT NULL");

最新更新