1

以下で構成される任意の文字列と一致させようとしています。

  1. 1 文字以上の任意の英数字文字列。それから
  2. 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 に答える