pda/zhuike/.svn/pristine/e8/e880f07cb5200b1fbeca31a52af...

117 lines
3.5 KiB
Plaintext
Raw Permalink Normal View History

2024-02-06 22:23:29 +08:00
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();
}
}