我根据您丢弃的正则表达式方法拼凑了一个完全未优化的程序并对其进行计时。它在 650 毫秒内完成(预热时为 250 毫秒)。最慢的部分不涉及正则表达式,而是String.format
. 如果我们用直接的StringBuilder
方法代替它,时间会下降到 40 毫秒。
public class Test {
static Pattern regex = Pattern.compile("(..)(..)(..)(..)(..)(..)");
public static void main(String[] args) {
final List<String> inMacs = new ArrayList<>(), outMacs = new ArrayList<>();
for (int i = 0; i < 80_000; i++) inMacs.add(mac());
final long start = System.nanoTime();
for (String mac : inMacs) {
final Matcher m = regex.matcher(mac);
m.matches();
outMacs.add(String.format("%s:%s:%s:%s:%s:%s",
m.group(1), m.group(2), m.group(3), m.group(4), m.group(5), m.group(6)));
}
System.out.println("Took " + (System.nanoTime() - start)/1_000_000 + " milliseconds");
final Iterator<String> it = outMacs.iterator();
for (int i = 0; i < 100; i++) System.out.println(it.next());
}
static Random rnd = new Random();
static String mac() {
final long mac = (long) (rnd.nextDouble()*(1L<<48));
return String.format("%012x", mac).toUpperCase();
}
}
如果您真的在寻找快速解决方案,请避免使用正则表达式并使用简单的测试来检测您的 MAC 格式:
static List<String> fixMacs(List<String> inMacs) {
final List<String> outMacs = new ArrayList<>(inMacs.size());
for (String mac : inMacs) outMacs.add(
mac.charAt(2) == '-'? mac.replace("-", ":")
: mac.charAt(2) != ':'? fixMac(mac)
: mac);
return outMacs;
}
static String fixMac(String inMac) {
final StringBuilder b = new StringBuilder(18);
for (int i = 0; i < inMac.length(); i++) {
b.append(inMac.charAt(i));
if (i%2 == 1 && i != inMac.length()-1) b.append(':');
}
return b.toString();
}
使用这种方法,我为您的 80,000 个 MAC 测量了 8 毫秒。