我认为这是从包含它们超集的字符串中替换某些符号集的最干净的解决方案。 appendreplacement是这种方法的关键。 一个重要的警告:不要在元素列表中包含任何未经检查的美元字符($)。通过使用“\ $”转义他们 最终使用
.replaceall(“\ $”,“\\ $”);在将每个字符串添加到列表之前,将其添加到 。 另见javadoc对$符号有疑问。
import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ReplaceTokens {
public static void main(String[] args) {
List elements = Arrays.asList("ax", "bx", "dx", "c", "acc");
final String patternStr = join(elements, "|"); //build string "ax|bx|dx|c|acc"
Pattern p = Pattern.compile(patternStr);
Matcher m = p.matcher("ax 5 5 dx 3 acc c ax bx");
StringBuffer sb = new StringBuffer();
Random rand = new Random();
while (m.find()){
String randomSymbol = elements.get(rand.nextInt(elements.size()));
m.appendReplacement(sb,randomSymbol);
}
m.appendTail(sb);
System.out.println(sb);
}
/**
* this method is only needed to generate the string ax|bx|dx|c|acc in a clean way....
* @see org.apache.commons.lang.StringUtils.join for a more common alternative...
*/
public static String join(List s, String delimiter) {
if (s.isEmpty()) return "";
Iterator iter = s.iterator();
StringBuffer buffer = new StringBuffer(iter.next());
while (iter.hasNext()) buffer.append(delimiter).append(iter.next());
return buffer.toString();
}