Created
October 10, 2012 09:10
-
-
Save aembleton/3864267 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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