1

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

  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。为什么?提前致谢!

4

3 回答 3

11

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

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

您需要转义.,因为在 Java 正则表达式中,它将匹配除行分隔符之外的任何字符

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

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

于 2013-04-30T14:03:58.470 回答
3

您必须在正则表达式中转义句点。由于 a\也必须被转义,这给出了

"[a-zA-Z0-9]+\\.\\.[a-zA-Z0-9]+"
于 2013-04-30T14:04:00.237 回答
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]+"));


}
于 2013-04-30T14:30:03.767 回答