2011-08-22 3 views
1

주어진 문자열이 'test/*'과 일치하는지 확인하고 싶습니다. 별표는 모든 문자를 표시합니다. Java 정규 표현식으로 어떻게 구현할 수 있습니까? mystring.matches("test[/].*+")을 시도했지만 작동하지 않았습니다.쉘 패턴 'test/*'에 해당하는 Java 정규식은 무엇입니까?

test - my String 
[/] - 1× forward slash 
. - any character 
*+ - 0 or more times 

여기에 무슨 문제가 있습니까?

+0

마지막 +를 제거하고 시도하십시오. *는 0 번 이상을 의미합니다. +는 1 회 이상을 의미합니다. 확실하지 *. +로 계산합니다. – arunkumar

+0

@arunkumar - 오류가 발생합니다. –

+1

나를 위해 좋은 작품! 정확히 작동하지 않는 것은 무엇입니까? –

답변

3

너무 많은 구문을 사용하고 있습니다. (어쨌든 동일하게 작동 할지라도)

mystring.matches("test/.*") 

/ 대괄호에있을 필요가없고, * 의미 "이전의 일을 0 번 이상 반복"보십시오. 결국 +을 추가하면 문제가 발생할 가능성이 높습니다.

+0

작품, 고마워. http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html 'X * +'는 X를 0 번 이상 찾습니다. 그게 뭔데? – Pedro

+0

오른쪽에서,'* +'문법은 자바에서 거의 사용되지 않는 "소유량"입니다. 나는 왜 그것이 당신을 위해 작동하지 않았는 지 확신하지 않는다. 나는 내가 그 구문을 직접 사용했다고 생각하지 않는다. 당신의 경우에,'*'는 정상적으로 처리되어야합니다. –

+0

@Pedro,'matches ("test [/].*+")'와'matches ("test [/].*")']는 똑같이 (대괄호를 사용하거나 사용하지 않고) 생성해야합니다. 첫 번째가 일치하지 않지만 두 번째는 일치하는 의견을 표시 할 수 있습니까? –

2

정규 표현식을 사용하면 사람들이 더 간단한 방법을 사용할 수 있다는 것을 잊어 버릴 수 있습니다. 내가 뭔가를 놓친 게 아니라면 startsWith ("test //")를 사용할 수 없습니까?

-2

"모든 캐릭터"가 의미하는 바에 달려 있습니다. 당신은 단지 하나 개의 문자를 정확히 원하지만 그것이 무엇인지 상관하지 않는 경우 "하나 또는-없음"을 원하는 경우

  • , 당신은 당신이 원하는 경우 .?
  • 를 원
  • .을 원하는 당신이 "제로 또는-더"를하려면 "한 - 또는 - 더", 당신은
  • .+를 원하는, 당신은 .*

는 또한, 당신은 전혀 /을 탈출 할 필요가 없습니다합니다. 따라서 "test/."은 "test 다음에 슬래시와 그 뒤에 정확히 하나의 문자가옵니다"와 일치합니다.

+2

이것이 잘못되었습니다! '. * +'는 가능한 한 많은 ** linebreaking하지 않는 문자를 의미하지만'+'는 그것을 소유욕으로 만들어서 그들이 다른 반복 횟수만큼 되돌아 오는 것을 막을 수 있도록합니다. '*'는 가능한 한 많은 것을 의미하고 (0 이상은 더 선호한다),'* +'는'(?>. *)와 같이 역행하지 않는 그룹으로 최대 매치를 만든다. '도 할 것이다. '. * +'와'(?>. *)'는 정확한 동의어입니다. \ cJ, \ cK, \ cL, \ cM, \ x85, \ x {2028} 유니 코드 라인 브레이크 문자를 일치시키기 위해'(? s)'또는'DOTALL'을 추가하십시오. , \ x {2029}. – tchrist

+1

@ 바트 : 단지 \ 012와 \ 015 이상입니다. [모든 유니 코드 줄 바꿈] (http://download.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#DOTALL)이어야합니다. '\ p {VertSpace} '를 가지고있는 것들이 7 개 있습니다. Java는 역사적으로 \ x85 문제가 있습니다. 예를 들어'\ s'는 WRT \ x85, \ xA0 및 \ x {202F}로 구분됩니다. 현재의 JDK 소스에서 DOTALL을 확인하십시오. – tchrist

+0

@tchrist, 그래, 나는 거기에 더 많은 것을 알았지 만, 그들을 좀 게으른 것으로 생각했다 :). 어쨌든, 귀하의 의견은 모든 기반을 다루고 있기 때문에 안전하게 제거 할 수 있습니다. 다음 번에는 대신 "줄 바꿈 문자"를 사용해야합니다! –

0

문자 선택에 "/"를 넣지 않아도됩니다. 이렇게하면 표현이 필요 이상으로 복잡해지고 평가할 때 비용이 많이 듭니다. 가능한 한 간단하게 유지하십시오.

public static void main(String[] args) { 
    String myString = "test/XYZ"; 
    boolean matches = myString.matches("test/.*"); 
    System.out.println(matches); 
} 

하나의 문자와 일치 시키려면 스타 연산자를 사용하지 마십시오.

public static void main(String[] args) { 
    String myString = "test/X"; 
    boolean matches = myString.matches("test/."); 
    System.out.println(matches); 
}