Skip to content

Instantly share code, notes, and snippets.

@aembleton
Created October 10, 2012 09:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aembleton/3864267 to your computer and use it in GitHub Desktop.
Save aembleton/3864267 to your computer and use it in GitHub Desktop.
package net.blerg.oracleToMysql.util;
import java.util.LinkedList;
import java.util.List;
public class PatternReplace {
public static String replace (String string, String pattern, String replacement, char wildcard, char escapeChar, boolean ignoreCase) {
//tokenise against the pattern
List<String> tokenisedPattern = tokenise(pattern, wildcard, escapeChar, true);
List<String> tokenisedReplacement = tokenise(replacement,wildcard,escapeChar,true);
List<String> replacements = replacements(string, tokenisedPattern, wildcard);
return replaceTokens(tokenisedReplacement, replacements, wildcard);
}
private static String replaceTokens(List<String> tokenisedReplacement,List<String> replacements,char wildcard) {
StringBuffer result = new StringBuffer();
int i=0;
for (String replacementPattern:tokenisedReplacement) {
if (replacementPattern.equals(String.valueOf(wildcard)) && replacements.size()>i) {
result.append(replacements.get(i));
i++;
}else {
result.append(replacementPattern);
}
}
return result.toString();
}
private static List<String> replacements(String string,List<String> pattern, char wildcard){
return replacements(string, pattern, wildcard, new LinkedList<String>());
}
private static List<String> replacements(String string,List<String> pattern, char wildcard, List<String> replacements){
if (pattern.size()>0 && string.length()>0) {
String patternElement = pattern.get(0);
if (patternElement.equals(String.valueOf(wildcard))) {
if (pattern.size()>1) {
int index = string.indexOf(pattern.get(1));
replacements.add(string.substring(0,index));
string = string.substring(index);
} else {
replacements.add(string);
string="";
}
}else if (patternElement.equals(string.substring(0,patternElement.length()))) {
string=string.substring(patternElement.length());
} else {
throw new IllegalArgumentException();
}
pattern=pattern.subList(1, pattern.size());
replacements = replacements(string,pattern,wildcard,replacements);
}
return replacements;
}
private static List<String> tokenise(String string, char splitOn, char escapeChar, boolean includeSplitCharAsToken){
List<String> tokenised = new LinkedList<>();
StringBuffer sb = new StringBuffer();
boolean escape = false;
for (char c:string.toCharArray()) {
if (c==splitOn && !escape) {
//split here
if (sb.length()>0) {
tokenised.add(sb.toString());
sb=new StringBuffer();
}
if(includeSplitCharAsToken) {
tokenised.add(String.valueOf(splitOn));
}
} else if(c==escapeChar){
escape = true;
} else {
sb.append(c);
}
}
if (sb.length()>0) {
tokenised.add(sb.toString());
}
return tokenised;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment