我正在尝试匹配包含以下内容的任何字符串:
".."
);然后例如:
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
。为什么?提前谢谢!
答案 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]+"));
}