2011-08-27 1 views
11
여기

6 정규식 여러 일치하는 간단한 패턴입니다 : ^([^:]+):(:? ([^ ]+))++$자바 한 그룹

다음은 내 텍스트입니다. foo: a b c d

Matcher은 나를 2 그룹으로 지정합니다 : foo (키) 및 d (값)입니다.

++ 대신 +?을 사용하면 d이 아니라 a이됩니다.

그래서 java는 그룹의 첫 번째 (또는 마지막) 발생을 반환합니다.

여기서는 하나만이 일치하므로 여기서는 find()을 사용할 수 없습니다.

정규 표현식을 2 부분으로 나누고 find의 값 배열을 사용하면 어떻게 될까요? 많은 다른 환경에서 정규 표현식으로 작업했으며 거의 ​​모두 "그룹 1의 첫 번째 발생", "그룹 1의 두 번째 발생"등을 가져 오는 기능을 가지고 있습니다.

JDK6에서 java.util.regex을 어떻게 처리 할 수 ​​있습니까?

감사합니다.

+0

당신이 거기에 대해 점을 명확히 주시겠습니까 "단지 * 하나 * 일치?" 당신이 묻는 것처럼 불확실한 수의 일치를 포착 할 수있는 방법이 없기 때문에 여기서는 약간의 반복이 필요합니다. – seh

+0

그것은 이미 2013이며 아직이 문제에 대한 적절한 해결책이 없습니다! * facepalm * – altern

답변

9

일치 그룹의 총 개수는 목표 문자열 (귀하의 경우 "foo: a b c d")에 의존하지 않지만 패턴에 달려 있습니다. 항상 것,

^([^:]+):(:? ([^ ]+))++$ 
^  ^^
|  | | 
1  2 3 

1 그룹 키를 개최, 3 군과 같은 일치하는 2 그룹,하지만 공백을 포함한다 : 당신의 패턴은 항상 3 개 그룹이됩니다 당신의 가치 중 단 하나를 잡아라. 이것은 첫 번째 값 (ungreedy +?의 경우)이거나 마지막 값 (greedy 일치의 경우)입니다.모든 얻을 공백을 것

- group(1) = "foo" 
- group(2) = "a b c d" 

한 다음에 2 그룹을 분할 : 그래서 당신이 다음 경기를 가지고

^([^:]+):\s*(.*)$ 

을 :

당신이 할 수있는 무엇은 일치한다 값 :

import java.util.Arrays; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 
    public static void main (String[] args) throws Exception { 
    Matcher m = Pattern.compile("^([^:]+):\\s*(.*)$").matcher("foo: a b c d"); 
    if(m.find()) { 
     String key = m.group(1); 
     String[] values = m.group(2).split("\\s+"); 
     System.out.printf("key=%s, values=%s", key, Arrays.toString(values)); 
    } 
    } 
} 

인쇄 할 내용 :

key=foo, values=[a, b, c, d] 
+0

하나, 나는 그녀가'(? :'not ('?)'을 의미했다고 생각한다. 그러나 더 중요한 것은, 이것은 공정한 비트를 요구 받는다. 나는 C#이 이것을하는 방법이 있다고 믿는다. API를 확장하여'group_array (N)'또는 일부를 통해 NᵗmM 그룹과 일치하는 배열을 검색 할 수 있도록합니다. 일반적으로 사용하기에는 너무 비싸기 때문에 새로운 패턴 컴파일 플래그가 필요합니다. 스칼라'$ 1'과'$ 2' 대신'@ 1'과'@ 2' 배열을 사용할 수 있고'$ 1 [$ # 1]'등을 의미하도록'$ 1'을 정의 할 수도 있습니다. :) – tchrist

+0

@tchrist, 예, 당신은':? '<->'? :'에 대해 옳을 수 있습니다. 저는이 C 그룹에 익숙하지 않았고,이 N 그룹핑 기능에 대해 들어 본 적이 없습니다. MSDN 링크가 있습니까? docs for me?). 그리고 그것은 확실히 유용하고 사악 할 것입니다! :) –

+0

무엇이 나를 오염 시키나요? :) 캡처 컬렉션 및 캡처 아래에 [이 제안] (http://msdn.microsoft.com/en-us/library/30wbz966(v=vs.71) .aspx # Y2320) 그래도 그걸 읽는 데 어려움이 있습니다. :) – tchrist

2
Scanner s = new Scanner(input).useDelimiter(Pattern.compile(":?\\s+")); 
String key = s.next(); 
ArrayList values = new ArrayList(); 
while (s.hasNext()) { 
    values.add(s.next()); 
} 
System.out.printf("key=%s, values=%s", key, values); 

그것은 인쇄 :

key=foo, values=[a, b, c, d]