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();
|
|
}
|
|
}
|