2009-12-12 3 views
16

정규 표현식에 대한 이해에서 "00 ###"문자열은 "[0-9] $"와 "[0-9]"가 일치해야합니다. 하지만 Java 정규 표현식에서는 작동하지 않습니다.

자바 정규 표현이 기본 모두^및 $ 문자로 고정되어 나타날 수 있습니다

어떤이 문제의 조사 후 나는 다음과 같은 정보 (http://www.wellho.net/solutions/java-regular-expressions-in-java.html)를 발견했다.

모든 JDK 버전에 해당하는지 확인할 수 있습니까? 이 모드를 사용 중지 할 수 있습니까 (예 :^및 $를 사용하여 기본 앵커링을 사용 중지 할 수 있습니까).

답변

21

귀하가 연결 한 기사가 귀하가 호출하는 기능에 따라 다릅니다. 기본적으로^및 $를 추가하려면 String#matches 또는 Matcher#matches을 사용하십시오. 원하지 않는 경우 Matcher#find 메소드를 대신 사용하십시오.

import java.util.regex.*; 

public class Example 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Matches: " + "abc".matches("a+")); 

     Matcher matcher = Pattern.compile("a+").matcher("abc"); 
     System.out.println("Find: " + matcher.find()); 
    } 
} 

출력 :

Matches: false 
Find: true 
+0

이것은 Java, BTW에만 국한되지 않습니다. 파이썬, 그리고 나는 또한 자바 스크립트 믿고, 일부 정규식 메서드는 기본적으로 앵커, 그리고하지 않는 다른 있습니다. –

+5

@Laurence : JavaScript의'test()','exec()'및'match()'메소드는 모두 똑같이 작동합니다 : 일치 항목을 고정 시키려면, 직접 고정해야합니다. 반면에, 파이썬의'match()'메소드는 자바의'lookingAt()'처럼 작동합니다; 일치는 문자열의 시작 부분에 고정되지만 끝 부분에는 고정되지 않습니다. –

3

마지막 성공적인 경기가 중단 된 Mr. Byers's answer뿐만 아니라, 그것도 Matcher#find() 종목을 확인합니다. 이는 Matcher 인스턴스를 반복적으로 사용하는 경우에만 중요하지만 Perl의 \G 어설 션을 에뮬레이션 할 수있는 기능입니다. Matcher#usePattern(Pattern)과 함께 사용하면 하나의 패턴을 사용하여 일부 접두사를 찾은 다음 반복 패턴 (\G 포함)을 바꿔서 Matcher#find()으로 반복되는 반복을 반복 할 수 있습니다.

또한 Matcher#lookingAt()도 있는데, 처음에는 암시 적으로 바운딩되어 있지만 (^) 끝은 아닙니다. 그 이름이 이맥스 함수 looking-at에서 영감을 얻은 것이라고 생각하는 것을 선호합니다.

3

예, matches()은 항상 정규식이 양쪽 끝에 고정 된 것처럼 작동합니다. 대상의 부분 문자열과 일치하는 전통적인 동작을 얻으려면 find()을 사용해야합니다 (다른 항목은 이미 지적한 바 있음). 자바의 matches() 메쏘드와 같은 것을 제공하는 정규 표현식 도구는 거의 없기 때문에 혼란이 타당합니다. 내가 생각할 수있는 유일한 다른 것은 XML Schema입니다.

관련 문제