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

时间:2013-04-30 14:02:39

标签: java regex string

我正在尝试匹配包含以下内容的任何字符串:

  1. 任何1个字符的字母数字字符串;然后
  2. 两个时期("..");然后
  3. 1个字符的任何字母数字字符串
  4. 例如:

    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 个答案:

答案 0 :(得分:11)

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

但是,你的正则表达式存在过度匹配的问题,它会为true等无效名称返回nodotname

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

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

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

答案 1 :(得分:3)

你必须在正则表达式中逃避这段时间。由于\也必须进行转义,因此

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

答案 2 :(得分:1)

我刚刚在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]+"));


}