다음과 같이 코드 코드를 복사합니다.
//파싱 전략, json 문자열을 파싱할 수도 있고 데이터의 이미지 주소, 이메일 등일 수도 있습니다.
packagecc.util.regex;
공개 열거형 RegexPolicy {
제이슨("제이슨"),
Image("ImageFromHtml");
개인 문자열 값;
RegexPolicy(문자열 값) {
this.value = 값;
}
@보수
공개 문자열 toString() {
// TODO 자동 생성된 메서드 스텁
반환값;
}
}
packagecc.util.regex;
import java.util.ArrayList;
java.util.HashMap 가져오기;
java.util.List 가져오기;
java.util.Map 가져오기;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
org.json.JSONArray 가져오기;
import org.json.JSONException;
org.json.JSONObject 가져오기;
import android.util.Log;
/**
* 데이터 분석을 위한 정적 클래스 도움말
* @author 왕cccong
* @버전 1.140122
* 생성 시간: 14-02-14
*/
공개 클래스 RegexUtil {
//파싱 전략과 일치하는 정규 표현식
//비공개 정적 최종 문자열 REGULAR_IMG_HTML = "<img +?src=/"(.+?)/""";
private static final String REGULAR_JSON_ITEM_NAME = "/"([^///" ]+?)/":";
//개인 정적 최종 문자열 REGULAR_JSON_ARRAY_NAME = ", *?/" *?([a-zA-Z0-9]*?) *?/" *?: *?//[ *?//{";
//공개 메서드 구문 분석, 문자열만 전달
공개 정적 개체 정규식(최종 RegexPolicy 정책, 최종 문자열 데이터) {
스위치(정책) {
케이스Json:
regexJson(데이터)를 반환합니다.
케이스 이미지:
부서지다;
기본:
부서지다;
}
null을 반환;
}
/**
* Json 문자열을 재귀적으로 구문 분석하여 정규식으로 Json 문자열 이름을 얻고,
* 분석 데이터 JsonObject 개체가 키 값 쌍(Map)을 반환하는 경우 Matcher 및 Pattern과 분석도 참조하세요.
* JsonArray List가 반환되면, 그렇지 않으면 String을 반환합니다.
* <br><b>주의사항:</b> Map을 반환하는 경우 값을 얻으려면 map.get(null)을 호출하는 것이 좋습니다.
* @see {@link java.util.regex.Matcher}, {@link java.util.regex.Pattern}
* @param jsonStr
* @return {@link java.util.Map} 또는 {@link java.util.List} 또는 {@link java.lang.String}
*/
개인 정적 개체 regexJson(최종 문자열 jsonStr) {
if (jsonStr == null) throw new NullPointerException("JsonString은 null이 아니어야 합니다.");
노력하다 {
if (isJsonObject(jsonStr)) {
최종 패턴 패턴 = Pattern.compile(REGULAR_JSON_ITEM_NAME);
최종 일치자 matcher = Pattern.matcher(jsonStr);
final Map<String, Object> map = new HashMap<String, Object>();
최종 JSONObject jsonObject = new JSONObject(jsonStr);
for ( ; matcher.find(); ) {
문자열 그룹 이름 = matcher.group(1);
객체 obj = jsonObject.opt(groupName);
if (obj != null && isJsonArray(obj.toString()))
matcher.region(matcher.end() + obj.toString().replace("//", "").length(), matcher.regionEnd());
if (obj != null && !map.containsKey(그룹 이름))
map.put(groupName, regexJson(obj.toString()));
}
반환 지도;
} else if (isJsonArray(jsonStr)) {
List<Object> list = new ArrayList<Object>();
JSONArray jsonArray = new JSONArray(jsonStr);
for (int i = 0; i < jsonArray.length(); i++) {
개체 개체 = jsonArray.opt(i);
list.add(regexJson(object.toString()));
}
반환 목록;
}
} 잡기(예외 e) {
// TODO: 예외 처리
Log.e("RegexUtil--regexJson", e.getMessage()+"");
}
jsonStr을 반환합니다.
}
/**
* 문자열이 JsonObject {@link org.json.JSONObject}인지 확인하려면
* @param jsonStr {@link java.lang.String}
* @return 부울
*/
개인 정적 부울 isJsonObject(최종 문자열 jsonStr) {
if (jsonStr == null) false를 반환합니다.
노력하다 {
새로운 JSONObject(jsonStr);
사실을 반환;
} 잡기(JSONException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
거짓을 반환;
}
}
/**
* 문자열이 JsonArray {@link org.json.JSONArray}인지 확인하려면;
* @param jsonStr {@link java.lang.String}
* @return 부울
*/
개인 정적 부울 isJsonArray(최종 문자열 jsonStr) {
if (jsonStr == null) false를 반환합니다.
노력하다 {
새로운 JSONArray(jsonStr);
사실을 반환;
} 잡기(JSONException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
거짓을 반환;
}
}
}
//사용방법
개체 개체 = RegexUtil.regex(RegexPolicy.Json, jsonStr.substring(jsonStr.indexOf("{"),
jsonStr.lastIndexOf("}")+1));
if (문자열의 객체 인스턴스) {
Log.e("string", object.toString());
} else if (Map의 객체 인스턴스) {
@SuppressWarnings("선택 해제됨")
HashMap<String, Object> map = (HashMap<String, Object>)객체;
Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
동안(iterator.hasNext()) {
Entry<String, Object> 항목 = iterator.next();
if (entry.getValue() 인스턴스of 목록) {
Log.e(entry.getKey(), Entry.getValue().toString());
} 또 다른 {
Log.e(entry.getKey(), Entry.getValue().toString());
}
}
} else if (List의 객체 인스턴스) {
Log.e("목록", object.toString());
}