import java.util.*;
class Foo {
private static volatile String r
;
List<String> datas = new ArrayList<>();
for (int i = 0; i < 100_000; ++i) {
datas.add(data(i));
}
for (int i = 0; i < 20; ++i) {
run(datas);
}
}
private static void run(List<String> datas) {
long start
= System.
nanoTime(); r = basic(data);
}
long basicElapsed
= System.
nanoTime() - start
;
r = regex(data);
}
long regexElapsed
= System.
nanoTime() - start
;
double ratio = (double) regexElapsed / basicElapsed;
System.
err.
printf("Basic: %d Regex: %d Ratio: %f%n", basicElapsed, regexElapsed, ratio
); }
return data.replaceAll("([^(]+)[(]([^)]+)[)].*", "$1$2");
}
// Assuming ( and ) are present in the string, in that order.
int openingBracket = data.indexOf('(');
int closingBracket = data.indexOf(')', openingBracket);
return new StringBuilder(closingBracket - 1)
// The bit up to (but not including) the (
.append(data, 0, openingBracket)
// The bit after the (, up to the ).
.append(data, openingBracket + 1, closingBracket)
.toString();
}
private static String data
(int i
) { return "Name" + i + " (birthyear)" + i;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgRm9vIHsKICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBTdHJpbmcgcjsKCiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICBMaXN0PFN0cmluZz4gZGF0YXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwXzAwMDsgKytpKSB7CiAgICAgIGRhdGFzLmFkZChkYXRhKGkpKTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKICAgICAgcnVuKGRhdGFzKTsKICAgIH0KICB9CgogIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuKExpc3Q8U3RyaW5nPiBkYXRhcykgewogICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgZm9yIChTdHJpbmcgZGF0YSA6IGRhdGFzKSB7CiAgICAgIHIgPSBiYXNpYyhkYXRhKTsKICAgIH0KICAgIGxvbmcgYmFzaWNFbGFwc2VkID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKCiAgICBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgZm9yIChTdHJpbmcgZGF0YSA6IGRhdGFzKSB7CiAgICAgIHIgPSByZWdleChkYXRhKTsKICAgIH0KICAgIGxvbmcgcmVnZXhFbGFwc2VkID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKCiAgICBkb3VibGUgcmF0aW8gPSAoZG91YmxlKSByZWdleEVsYXBzZWQgLyBiYXNpY0VsYXBzZWQ7CiAgICBTeXN0ZW0uZXJyLnByaW50ZigiQmFzaWM6ICVkICAgIFJlZ2V4OiAlZCAgICBSYXRpbzogJWYlbiIsIGJhc2ljRWxhcHNlZCwgcmVnZXhFbGFwc2VkLCByYXRpbyk7CiAgfQoKICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVnZXgoU3RyaW5nIGRhdGEpIHsKICAgIHJldHVybiBkYXRhLnJlcGxhY2VBbGwoIihbXihdKylbKF0oW14pXSspWyldLioiLCAiJDEkMiIpOwogIH0KCiAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2ljKFN0cmluZyBkYXRhKSB7CiAgICAvLyBBc3N1bWluZyAoIGFuZCApIGFyZSBwcmVzZW50IGluIHRoZSBzdHJpbmcsIGluIHRoYXQgb3JkZXIuCiAgICBpbnQgb3BlbmluZ0JyYWNrZXQgPSBkYXRhLmluZGV4T2YoJygnKTsKICAgIGludCBjbG9zaW5nQnJhY2tldCA9IGRhdGEuaW5kZXhPZignKScsIG9wZW5pbmdCcmFja2V0KTsKICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihjbG9zaW5nQnJhY2tldCAtIDEpCiAgICAgICAgLy8gVGhlIGJpdCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSAoCiAgICAgICAgLmFwcGVuZChkYXRhLCAwLCBvcGVuaW5nQnJhY2tldCkKICAgICAgICAvLyBUaGUgYml0IGFmdGVyIHRoZSAoLCB1cCB0byB0aGUgKS4KICAgICAgICAuYXBwZW5kKGRhdGEsIG9wZW5pbmdCcmFja2V0ICsgMSwgY2xvc2luZ0JyYWNrZXQpCiAgICAgICAgLnRvU3RyaW5nKCk7CiAgfQoKICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGF0YShpbnQgaSkgewogICAgcmV0dXJuICJOYW1lIiArIGkgKyAiIChiaXJ0aHllYXIpIiArIGk7CiAgfQp9Cg==