2014-11-16 8 views
0

업데이트가 있는지 온라인으로 확인하는 프로그램을 작성 중입니다. 내가 업데이트 확인을 위해 사용하는 사이트는 나에게 다음과 같습니다 일반 텍스트 응답을 제공합니다Regex 캡처 그룹 부정하기

filename:foobar0.2.3-dev.zip 

무엇을 달성하려고하는 것은 내가없이 받도록 문자열 중 버전 번호 (0.2.3-dev)를 얻을 수 있습니다 파일 이름은 매번이 형식이어야하므로 baz0.2.3-dev.jar 등에서도 작동해야합니다.

나는 어떻게이 일을 할 수 있었는지 전혀 알지 못해 어떤 도움을 주시면 감사하겠습니다.

친절하게 제공합니다.

벤의 도움으로

@EDIT

(아래 그의 대답을 참조) 나는 방법을 생각이 완료하세요.

String input = "filename:foobar0.2.3-dev.zip"; 
Pattern p = Pattern.compile(".*?((\\d+(?:\\.\\d+)*).+)\\..*"); 
Matcher m = p.matcher(input); 

if(m.matches()) { 
    System.out.println(m.group(1)); // This should output 0.2.3-dev 
} 
+0

는 어떻게 확인합니까'0.2.3-dev'는 갱신 실제로? 그것의 old_string! = capture_group_1, 당신은 정말 정규식이 필요하지 않습니다. – sln

+0

이'. *? ((\ d + (? : \. \ d +) *). +) \ .. *'는 문제를 일으킬 것입니다. 자체적으로 남겨두면 버전의 일부일 수있는 마지막 기간을 정렬/소비합니다. – sln

+0

방탄 버전은''. * ((? sln

답변

1

당신은 자바에 대한 here

, 수입 자바 다음

/(\d+\.\d+\.\d+-dev)/ 

와 직접보기로 "number.number.number-dev에"일치하도록 시도 할 수 .util.regex. * 및 시도 :

Pattern p = Pattern.compile(".*?(\\d+\\.\\d+\\.\\d+-dev).*"); 
    Matcher m = p.matcher("filename:foobar0.2.3-dev.zip"); 
    if (m.matches()) { 
     System.out.println(m.group(1)); 
    } 
    else { 
     System.out.println("Pattern does not match"); 
    } 

실제 작동 중 here

+0

오, 미안해 하지마. Java에서이 작업을 수행해야합니다 (Java로 작성된 프로그램이기 때문에). 내가 아는 한 특정 정규 표현식과 일치하는 특정 하위 문자열을 얻을 수있는 방법은 없습니다. – mezzodrinker

+0

있습니다. 응답을 편집 할 것입니다. – Ben

+0

처음에 greedy 수량 한정자 ('. *')는 버전 번호의 첫 번째 부분을 사용하지 않도록 게으른/마지 못해 한정 기호 ('. *?') 여야합니다. – mezzodrinker

0

다음은 1 - 4 버전 번호를 캡처하는 방법입니다.

# "(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?)?-dev" 


(\d+)     # (1) 
(?: 
     \. 
     (\d+)    # (2) 
     (?: 
      \. 
      (\d+)   # (3) 
      (?: 
       \. 
       (\d+)  # (4) 
      )? 
    )? 
)? 
-dev 

출력

** Grp 0 - (pos 15 , len 9) 
0.2.3-dev 
** Grp 1 - (pos 15 , len 1) 
0 
** Grp 2 - (pos 17 , len 1) 
2 
** Grp 3 - (pos 19 , len 1) 
3 
** Grp 4 - NULL