117 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | package com.novelbook.android.utils; | ||
|  | 
 | ||
|  | import java.util.ArrayList; | ||
|  | import java.util.List; | ||
|  | import java.util.Map; | ||
|  | import java.util.regex.Matcher; | ||
|  | import java.util.regex.Pattern; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | public class REUtil { | ||
|  | 	private static final String[] EMPTY = new String[0]; | ||
|  | 
 | ||
|  | 	public static String getDomain(String fullUrl){ | ||
|  | 		return  REUtil.match("(?i)http[s]?://[^/]+", fullUrl); | ||
|  | 	} | ||
|  | 	public static String match(String pattern, String target) { | ||
|  | 		return match(pattern, target, true); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static String match(String pattern, String target, boolean caseInsensitive) { | ||
|  | 		Pattern p = createPattern(pattern, caseInsensitive); | ||
|  | 		Matcher matcher = p.matcher(target); | ||
|  | 		if (matcher.find()) { | ||
|  | 			return matcher.group(); | ||
|  | 		} else { | ||
|  | 			return ""; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static String[] matchs(String pattern, String target) { | ||
|  | 		return matchs(pattern, target, true); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static String[] matchs(String pattern, String target, boolean caseInsensitive) { | ||
|  | 		Pattern p = createPattern(pattern, caseInsensitive); | ||
|  | 		Matcher matcher = p.matcher(target); | ||
|  | 		List<String> contents = new ArrayList<String>(); | ||
|  | 		while (matcher.find()) { | ||
|  | 			contents.add(matcher.group()); | ||
|  | 		} | ||
|  | 		return contents.toArray(EMPTY); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static String group(String pattern, String target, int index) { | ||
|  | 		return group(pattern, target, true, index); | ||
|  | 	} | ||
|  | 	public static String group(String pattern, String target, boolean caseInsensitive, int index) { | ||
|  | 		Pattern p = createPattern(pattern, caseInsensitive); | ||
|  | 		Matcher matcher = p.matcher(target); | ||
|  | 		if (matcher.find()) { | ||
|  | 			try { | ||
|  | 				return matcher.group(index); | ||
|  | 			} catch (IndexOutOfBoundsException err) { | ||
|  | 				throw new IllegalArgumentException(String.format("pattern [%s]'s index[%s] is out of bound.", pattern, index)); | ||
|  | 			} | ||
|  | 		} else { | ||
|  | 			return ""; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static String[] groups(String pattern, String target) { | ||
|  | 		return groups(pattern, target, true); | ||
|  | 	} | ||
|  | 	public static String[] groups(String pattern, String target, boolean caseInsensitive) { | ||
|  | 		Pattern p = createPattern(pattern, caseInsensitive); | ||
|  | 		Matcher matcher = p.matcher(target); | ||
|  | 		if (matcher.find()) { | ||
|  | 			int groupCount = matcher.groupCount(); | ||
|  | 			String[] parts = new String[groupCount]; | ||
|  | 			for (int i = 1; i <= groupCount; i++) { | ||
|  | 				parts[i - 1] = matcher.group(i); | ||
|  | 			} | ||
|  | 			return parts; | ||
|  | 		} else { | ||
|  | 			return EMPTY; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	 | ||
|  | 	private static Map<String, Pattern> patterns = new FIFOMap<String, Pattern>(100); | ||
|  | 	public static Pattern createPattern(String patternValue, boolean caseInsensitive) { | ||
|  | 		Pattern pattern = patterns.get(patternValue); | ||
|  | 		if (pattern == null) { | ||
|  | 			synchronized (patterns) { | ||
|  | 				pattern = patterns.get(patternValue); | ||
|  | 				if (pattern == null) { | ||
|  | 					pattern = Pattern.compile(patternValue, caseInsensitive ? Pattern.CASE_INSENSITIVE : 0); | ||
|  | 					patterns.put(patternValue, pattern); | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 		 | ||
|  | 		return pattern; | ||
|  | 	} | ||
|  | 	 | ||
|  | 	public static String replace(String source, String regex, String target) { | ||
|  | 		if (target.indexOf('$') == -1) { | ||
|  | 			return source.replaceAll(regex, target); | ||
|  | 		} | ||
|  | 		 | ||
|  | 		StringBuilder buffer = new StringBuilder(source); | ||
|  | 		String[] matchedValues = REUtil.matchs(regex, source); | ||
|  | 		int start = 0; | ||
|  | 		for (String matchedValue : matchedValues) { | ||
|  | 			String[] groups = REUtil.groups(regex, matchedValue); | ||
|  | 			start = buffer.indexOf(matchedValue, start); | ||
|  | 			String newTarget = target; | ||
|  | 			for (int i = 0; i < groups.length; i++) { | ||
|  | 				newTarget = newTarget.replaceAll(String.format("\\$%s", i+1), groups[i]); | ||
|  | 			} | ||
|  | 			buffer.replace(start, start + matchedValue.length(), newTarget); | ||
|  | 			start += newTarget.length(); | ||
|  | 		} | ||
|  | 		return buffer.toString(); | ||
|  | 	} | ||
|  | } |