2014-03-06 3 views
2

공백으로 구분 된 숫자 목록에서 단일 '1'을 찾습니다.왜이 부정적인 lookbehind 고정 길이 정규식이 작동하지 않습니까?

public class RegexTester { 
    public static void main(String[] args) { 

    String test1 = "1 2"; 
    String test2 = "2 1 2"; 
    String test3 = "2 11 2"; 

    String regex = "(?<!\\d)1(?!\\d)"; 

    System.out.println("Matches 1: " + test1.matches(regex)); 
    System.out.println("Matches 2: " + test2.matches(regex)); 
    System.out.println("Matches 3: " + test3.matches(regex)); 
    } 
} 

출력은 다음과 같습니다 :

Matches 1: false 
Matches 2: false 
Matches 3: false 

그러나 (IMO)해야한다 : 여기에 몇 가지 예제 코드입니다

Matches 1: true 
Matches 2: true 
Matches 3: false 

Lookbehind이 고정 길이는, 그래서 나는 이유에 혼란 스러워요 이 정규식은 일치하지 않습니다. 이유를 알았다면이 케이스에 대한 대안적인 정규 표현식을 제공 할 수 있습니다.

감사합니다.

+0

당신이 방법을 의미합니까? 어쩌면 나는 분명하지 않다. '1'이 공백으로 둘러싸 일 때나 아무것도하지 않아도 될 때마다 일치해야한다. 대체 정규 표현식에 대한 아이디어를 제공하지만, 왜 이것이 작동하지 않는지에 대해서는 대답하지 않는다. –

답변

2

당신의 정규식이 맞습니다. 문제는 matches 메서드가 전체 입력 문자열이 정규식과 일치 할 수있는 부분 문자열을 포함하고 있지 않은지 여부를 확인하는 것입니다.

클래스에서 find() 메서드를 사용할 수도 있습니다.

String test1 = "1 2"; 
String test2 = "2 1 2"; 
String test3 = "2 11 2"; 

String regex = "(?<!\\d)1(?!\\d)"; 
Pattern p = Pattern.compile(regex); 

System.out.println("Matches 1: " + p.matcher(test1).find()); 
System.out.println("Matches 2: " + p.matcher(test2).find()); 
System.out.println("Matches 3: " + p.matcher(test3).find()); 

출력 :

Matches 1: true 
Matches 2: true 
Matches 3: false 

업데이트 : 당신이 정말로 matches를 사용해야하는 경우 필요한 옆에

당신은 단지 하나의 부품 귀하의 정규식의 시작과 끝에서 .* 수 추가 할 수 있습니다 regex에 의해 소비 될 수도 있습니다.

String regex = ".*(?<!\\d)1(?!\\d).*"; 

System.out.println("Matches 1: " + test1.matches(regex)); 
System.out.println("Matches 2: " + test2.matches(regex)); 
System.out.println("Matches 3: " + test3.matches(regex)); 

출력 :

Matches 1: true 
Matches 2: true 
Matches 3: false 
+0

아, 네 말이 맞아. 나는 여전히 대안을 찾아야하지만, 나는 'match'를 사용하는 라이브러리 코드를 사용하고있다. 고마워, 나는 대답을 가능한 빨리 받아 들일 것이다. –

관련 문제