2013-09-02 3 views
1

숫자를 String의 배열에 넣고 싶지만 정규 표현식과 그룹을 제대로 사용할 수 없습니다.정규식 Matcher.group을 사용하여 단어를 복사하십시오.

코드 :

package regex; 

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

public class Regex { 

    public static void main(String[] args) { 
     String s = "A: 123/456 BC: 78/90 NEw: 105 E: 0 BK: 10 None: 0%"; 
     Pattern p = Pattern.compile("(\\w+): (\\d+)"); 
     Matcher m = p.matcher(s); 
     String[] as = new String[7]; 
     as[2] = m.group(); //array list?? 
     for (int i = 2; i < 2; i++) { 
      System.out.println(as[i]); 
     } 
    } 
} 

답변

1

당신은 당신이 그것을 사용하려고하는 방법을 작동하지 않습니다

Pattern p = Pattern.compile("(\\w+): (\\d+/{0,1}\\d*%{0,1})");

+0

'/home/thufir/NetBeansProjects/regex/src/regex/Regex.java:37 : 오류 : 불법 이스케이프 문자 패턴 P =는 Pattern.compile ("(\\ w +) : (\\ d + \/{0,1} \\ d * \ % {0,1}) "); ' – Thufir

+1

지금 사용해보십시오. 이것은 효과가있다. – Aashray

1

Matcher

Pattern p = Pattern.compile("(\\w+): (\\d+)");

을 변경해야합니다. group() 메서드는 마지막으로 일치하는 그룹을 반환합니다. 정규식에 일치하는 항목을 실제로 알려려면 find()을 먼저 호출해야합니다. find()은 정규가 다음 경기를 발견 할 수 있는지 여부를 알려주는 부울을 반환하도록 할 수 있습니다이 같은 모든 경기를 통해 루프 :

while (m.find()) { 
    String text = m.group(); 
    // ... 
} 
+0

좋아, 나는 그것을 보았다, 나는 왜 그것이 반복해야하는지 알 수 없다. 그러나 나는 더 많이 조사 할 것이다. 고마워 :) – Thufir

+1

루핑은 게으른 일치를 허용 - 모든 일치를 검색하는 대신, 우리는 임의의 순간에 중지 할 수 있습니다. 나는'getMatch (int num)'타입 인터페이스로도 할 수 있었을 것으로 추측하지만, 대신이 방법으로 설계되었다. 아마도 explicitness를 위해? –

+0

또한 "게으른"사용으로 인해 그 의미를 더 잘 이해할 수 있습니다. – Thufir

0

그냥 내가 반응이이 밖으로 던져 줄 알았는데 :

package regex; 

import java.util.AbstractMap; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Regex { 

    public static void main(String[] args) { 
     List<Map.Entry> l = new ArrayList<>(); 
     String monitor = "A: 123/456 BC: 78/90 NEw: 105 E: 0 BK: 10 None: 0%"; 
     Pattern outerPattern = Pattern.compile("(\\w+): (\\d+)"); 
     Matcher outerMatcher = outerPattern.matcher(monitor); 
     String outerGroup = null; 
     int i = 0; 
     Pattern innerPattern; 
     Matcher innerMatcher; 
     String innerGroup = null; 
     while (outerMatcher.find()) { 
      outerGroup = outerMatcher.group(); 
      System.out.println(outerGroup); 
      innerPattern = Pattern.compile("(\\w+): (\\d+)"); 
      innerMatcher = innerPattern.matcher(outerGroup); 
      while (innerMatcher.find()) { 
       innerGroup = innerMatcher.group(); 
       System.out.println(innerGroup); 
       Map.Entry<String, Integer> entr = new AbstractMap.SimpleEntry<>("exmpleString", 42); 
       l.add(entr); 
      } 
     } 
    } 
} 
1

당신은 정규 표현식 시도 할 수 있습니다 :

(\w+): +(\S+) 

Regular expression visualization

예컨대 :

private static final Pattern REGEX_PATTERN = 
     Pattern.compile("(\\w+): +(\\S+)"); 

public static void main(String[] args) { 
    String input = "A: 123/456 BC: 78/90 NEw: 105 E: 0 BK: 10 None: 0%"; 
    Matcher matcher = REGEX_PATTERN.matcher(input); 
    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 
} 

출력 :

A: 123/456 
BC: 78/90 
NEw: 105 
E: 0 
BK: 10 
None: 0% 

당신이 이름, matcher.group(1) 또는 matcher.group(2)를 얻고 싶다면

.

private static final Pattern REGEX_PATTERN = 
     Pattern.compile("(\\w+): +(\\S+)"); 

public static void main(String[] args) { 
    String input = "A: 123/456 BC: 78/90 NEw: 105 E: 0 BK: 10 None: 0%"; 
    Matcher matcher = REGEX_PATTERN.matcher(input); 
    while (matcher.find()) { 
     System.out.println("Name: " + matcher.group(1)); 
     System.out.println("Number: " + matcher.group(2)); 
    } 
} 

출력 :

Name: A 
Number: 123/456 
Name: BC 
Number: 78/90 
Name: NEw 
Number: 105 
Name: E 
Number: 0 
Name: BK 
Number: 10 
Name: None 
Number: 0% 
+0

오, 고마워, 나는'matcher.group (int) '을 잘못 사용하고 있었다. 사용법을 보여 주셔서 감사합니다. – Thufir

관련 문제