从postgresql开始并准确的单词正则表达式模式

时间:2016-05-17 05:38:22

标签: java regex postgresql

我有这些student_id(int)数据

20001001 
20001002 
20001003 
20001004 
20001005

我想使用正则表达式模式,其中;

  1. 使用'2000'时,将显示所有数据(以...开头)
  2. 使用'20001002'时,仅显示特定数据(完全匹配)
  3. 我尝试使用这种正则表达式来实现我的目标;

    '^[X]+[0-9a-zA-Z]*$'
    

    其中x是一个字符串变量,它的值取决于我想要显示的数据; “2000”或更具体的“20001002”

    然而,我的第二个目标(完全匹配)没有得到满足,我的正则表达式模式应该做些什么改变才能达到我的2个目标?

    我正在使用Java JDBC和Postgresql。

    public static ResultSet searchStudentQuery(Connection connection, String dbTable, String searchCriteria)
            throws SQLException {
    
        String regex = "^[" + searchCriteria.trim().toUpperCase() + "]+[0-9a-zA-Z]*$";
        PreparedStatement searchStudent = connection.prepareStatement(
                "SELECT * FROM " + dbTable + " WHERE CAST(student_id AS TEXT) ~ ? OR first_name ~ ? OR last_name ~ ?;");
    
        searchStudent.setString(1, regex);
        searchStudent.setString(2, regex);
        searchStudent.setString(3, regex);
        return searchStudent.executeQuery();
    
    }
    

    编辑:如果可能,我想以postresql查询方式执行此操作

1 个答案:

答案 0 :(得分:1)

您使用方括号

定义了一个字符类
"^[" + searchCriteria.trim().toUpperCase() + "]+"....
  ^                                           ^

然后在其后设置+量词。因此,您既不会考虑订单,也不会考虑searchCriteria字符串中的字符数。您可以将RAM[ARM]+正则表达式匹配,甚至可以与RAMARMAMRAM等匹配。

您可以删除[]+以强制执行严格的模式匹配("确切的"字匹配):

String regex = "^" + searchCriteria.trim().toUpperCase() + "[0-9a-zA-Z]*$";