有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么这个Java正则表达式不起作用?

我正在尝试匹配由以下内容组成的任何字符串:

  1. 任何1个字符以上的字母数字字符串;然后
  2. 两个时期("..");然后
  3. 任何1个字符以上的字母数字字符串

例如:

mydatabase..mytable
anotherDatabase23..table28

等等

鉴于以下功能:

public boolean isValidDBTableName(String candidate) {
    if(candidate.matches("[a-zA-Z0-9]+..[a-zA-Z0-9]+"))
        return true;
    else
        return false;
}

将值"mydb..tablename"传递给此函数会使其返回false。为什么?提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    正如NeplatnyUdaj在评论中指出的,您当前的正则表达式应该为输入"mydb..tablename"返回true

    但是,您的正则表达式存在过度匹配的问题,它返回true作为无效名称,例如nodotname

    您需要转义.,因为在Java正则表达式中,it will match any character except for line separators

    "[a-zA-Z0-9]+\\.\\.[a-zA-Z0-9]+"
    

    在正则表达式中,可以使用\转义元字符(具有特殊含义的字符)。要在字符串文本中指定\,需要再次对其进行转义

  2. # 2 楼答案

    必须在正则表达式中转义句点。由于\也必须转义,因此

    "[a-zA-Z0-9]+\\.\\.[a-zA-Z0-9]+"
    
  3. # 3 楼答案

    我刚刚在Eclipse中尝试了你的正则表达式,它起了作用。或者至少没有失败。尝试剥离空白字符

    @Test
    public void test()
    {
        String testString = "mydb..tablename";
        Assert.assertTrue("no match", testString.matches("[a-zA-Z0-9]+..[a-zA-Z0-9]+"));
        Assert.assertFalse("falsematch", "a.b".matches("[a-zA-Z0-9]+..[a-zA-Z0-9]+"));
    
    
    }