2016-08-02 2 views
-2

Java를 처음 사용했습니다. 누군가가 나에게 문자열에서 값을 얻을하는 방법에 대한 몇 가지 단서를 제공시겠습니까 반환되는 캐릭터 라인이 유형의 경우 : Java에서 리턴 문자열 구문 분석

[(key1,value1), (key2,value2), (key3, value3)] 

는 또한 그 값 필드도 , 쉼표를 포함 할 수 있습니다. 값이 괄호 안에 있고 꺾쇠 괄호 안에 들어 있기 때문에 GSON 방식을 사용할 수 없었습니다. 유일한 해결책은 문자열을 먼저 처리하여 JSON 구조를 따르는 것입니까?

+0

더 명확하게 질문을 넣으려면 [(key1, value1), (key2, value2), (key3, value3)] 문자열에서 value1, value2를 검색하는 방법 – user2593186

+0

더 분명한? 코드 예제를 알려주십시오. –

+0

죄송합니다, 질문은 위의 키 - 값 쌍이 대괄호 안에있을 때 값을 검색하는 방법입니다 – user2593186

답변

0

다음은 정규 표현식을 사용하여 키와 값을 검색하는 간단한 예제입니다. 노트; 공백이 포함 된 키/값 쌍을 지원하지 않습니다. 그것은 하나의 단어라고 가정합니다.

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Iterator; 


public class Main { 
    private static final Pattern KEY_VALUE_PAIR = Pattern.compile("\\(\\s?+([^,\\s]+)\\s?,\\s?+([^)\\s?]+\\s?+)\\)"); 
    public static void main(String[] args) { 
     Map<String, String> pairs = getKeyValuePairs("[(key1,value1), (key2,value2), (key3, value3)]"); 
     Iterator it = pairs.entrySet().iterator(); 
     while (it.hasNext()) { 
      Map.Entry pair = (Map.Entry)it.next(); 
      System.out.println(pair.getKey() + " = " + pair.getValue()); 
      it.remove(); 
     } 
    } 

    private static Map<String, String> getKeyValuePairs(String input) { 
     Map<String, String> matches = new HashMap<String, String>(); 
     Matcher m = KEY_VALUE_PAIR.matcher(input); 
     while (m.find()) { 
      matches.put(m.group(1), m.group(2)); 
     } 
     return matches; 
    } 
} 
+0

답변 해 주셔서 감사합니다. 문자열을 문제 문자열로 바꿨을 때 원하는 정확한 값을 얻었습니다. 정말로 시간을 내 주셔서 감사합니다. 문자열을 파싱하고 값을 얻으려면 전설적인 처리를하고있었습니다. – user2593186

+0

String meta_data = file.getMetaTags(). get ("org.restlet.http.headers"). toString(); String str3 = meta_data.replace ("[", ""); 문자열 str4 = str3.replace ("(", ""); 문자열 str5 = str4.replace (")", ""); 문자열 str6 = str5.replace (")", ""); Set mySet = new HashSet(); 집합 집합 = 새 HashSet (Arrays.asList (str6.split (","))); – user2593186

+0

Iterator iterator = set.iterator(); while (iterator.hasNext()) { 문자열 str = (문자열) iterator.next(); System.out.println ("반복자 루프 :"+ iterator.next()); if (str.contains (",")) { String [] new_str = str.split (","); map.put (new_str [0], new_str [1]); } – user2593186

0

실제로이 = 쌍을 나타내는 문자열 배열을 얻기 위해 ")" "("접근 방식은 정규식에 대한 입력을 분할 기본적으로)

실행을 시도하지 않았 음을 유의하시기 바랍니다.

그런 다음이 배열을 반복하고 첫 번째 ","다음에 오는 모든 것을 추출합니다. 여기서 우리는 키에 문자 ","가 포함되지 않는다는 암묵적인 가정을합니다.

String str[] = "[(key1,value1), (key2,value2), (key3, value3)]".split("(.*)"); 
ArrayList<String> values = new ArrayList<>(); 

String tmp; 
for(int i = 0; i < str.length; i++) { 
    values.add(str[i].substring(str[i].indexOf(","), str[i].length())) 
} 
+0

그가 원하는 텍스트에 분할하지 않고 대괄호를 그대로두고 쉼표를 분리 하시겠습니까? – Aderis

+0

예, 아 데리스, 당신 말이 맞습니다. –

1

문제에는 몇 가지 문제가 있습니다. 구문 분석 된 값과 키에는 쉼표가 포함될 수 있고 키와 값은 쉼표로 구분되므로 쉼표 사이의 숫자가 값이나 키에 속하는지 만 추측 할 수 있습니다. 또한 키와 값의 유형을 지정하지 않았습니다.

다음 코드는 입력 문자열이 올바르게 형식화되지 않은 경우 예외를 발생시키지 않으며 잘못된 입력을 제공하면 영구 실행될 수 있습니다. 또한 첫 번째 쉼표를 구분 기호으로 해석합니다. 나는 키가 가정 값은 직접 구문 분석 할 수 String 형,의 모두 :

HashMap<String, String> result = new HashMap<>(6); 
String text = "[(age,120), (eyes,5), (feet, 8)]"; 

int index = text.indexOf("[") + 1; // now one index after '[' 
while (index < text.length() && text.charAt(index) != '(') 
    index++; //skip until we hit the start: '(' 


//this loop runs once for every pair (key, value). In this example three times 
main: while(index < text.length()) { 
    index++; //skip '(' 

    // parse the key, until a comma appears 
    int keyStart = index; 
    while (text.charAt(index) != ',') index++; 
    int keyEnd = index; 

    index++; //skip ',' 

    // parse the value, until a closing bracket appears 
    int valueStart = index; 
    while (text.charAt(index) != ')') index++; 
    int valueEnd = index; 

    // extract the actual Strings, using the parsed indices start & end 
    String key = text.substring(keyStart, keyEnd).trim(); 
    String value = text.substring(valueStart, valueEnd).trim(); 
    result.put(key, value); 

    // parse to the next pair (x,y), or exit 
    while (text.charAt(index) != '(') { 
     if(text.charAt(index) == ']') 
      break main; // finish parsing, break main loop 
     index++; 
    } 
} 

System.out.println(result); // output = {feet=8, eyes=5, age=120} 

무관 노트 :이 코드는 효율적으로 실행됩니다. String.substring, String.indexOf 또는 심지어 정규 표현식, 패턴 또는 이와 유사한 것을 사용하는 코드는 동일한 문자를 여러 번 처리 할 수 ​​있습니다. 이 코드에서 모든 문자는 한 번만 exaclty로 구문 분석되며 모든 관련 문자 (값 및 키)는 한 번만 복사됩니다.

구문은 비교적 자유 롭습니다. 두 쌍 사이의 텍스트와 같은 관련성이없는 기호 또는 공백은 모두 무시됩니다.. 구문은 다음과 같다 :

  1. 파싱한다 [] 간의 페어 (0을 포함) 번호
  2. 모든 쌍은 괄호로 묶인해야; 키와 값은 쉼표로 구분해야합니다. 첫 번째 쉼표가 사용됩니다. 예 : (name , value)

이름 쌍의 쉼표를 제외하고 )]을 포함하여 모든 기호를 포함 할 수 있습니다.쌍의 값은 닫는 괄호를 제외한 ](을 포함하여 모든 기호를 포함 할 수 있습니다. 이름 및 값 주변의 공백이 제거됩니다. 예 : (my name , val,ue) -> name = my name 및 값 = val,ue. String.trim()을 참조하십시오.

[(,)] 또한 유효한 구문이며 HashMap에서 빈 문자열이됩니다.