2013-04-30 2 views
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"은을 반환합니다.. 왜? 미리 감사드립니다!

+2

후보자가 다른 문자를 포함하지 않았습니까? \ n과 (과) 비슷합니까? 도트는 이스케이프되어야하지만 어쨌든 일치해야합니다. 또한 부울 값을 반환하기 위해 if-else를 만들지 않아야합니다. 그냥 표현의 결과를 반환합니다. – NeplatnyUdaj

답변

11

NeplatnyUdaj가 의견에서 지적했듯이 현재 정규식은 "mydb..tablename"의 입력에 대해 true을 반환해야합니다.

그러나 정규식은 nodotname과 같은 유효하지 않은 이름의 경우 true을 반환하는과 일치 문제가 있습니다.

당신은 it will match any character except for line separators, 자바 정규식에 있기 때문에, .을 탈출해야합니다 정규식에서

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

, 당신은 \와 메타 문자 (특별한 의미를 가진 문자)를 탈출 할 수 있습니다. 문자열 리터럴에 \을 지정하려면 다시 이스케이프 처리해야합니다.

+0

그것은 이유가 아닙니다. 도트가 점을 포함하는 모든 문자와 일치하므로 OP의 예가 반드시 일치해야합니다. 문제는 다른 곳에서 발생합니다 – NeplatnyUdaj

+0

@NeplatnyUdaj : 질문을주의 깊게 읽지는 않았지만'random.random'이 일치하지 않도록 수정해야합니다. – nhahtdh

+0

nhahtdh : 물론 OP의 regexp가 잘못되어 괜찮습니다. 나는 어쨌든 예제와 일치해야한다는 것을 지적하고있다 (나는 그것을 시도했다). – NeplatnyUdaj

3

정규식에서 마침표를 이스케이프 처리해야합니다. \도 이스케이프해야합니다,이 난 그냥 이클립스에서 정규식을 시도하고 일했다

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

제공합니다. 아니면 적어도 실패하지 않았다. 공백 문자를 제거하십시오.

@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]+")); 


} 
관련 문제