/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
test("hello's");
test(";;;1235'5454!!");
test(";;;1235'L454!!'");
}
static void test
(String input
) { String replaceInBetween
= replaceInBetween
(input
); System.
out.
println("regex: " + regex
); System.
out.
println("rib: " + replaceInBetween
); System.
out.
println(regex.
equals(replaceInBetween
)); }
substr = substr.replaceAll("([^\\p{L}\\p{N}\\p{Mn}_\\-<>'])"," $1 ");
substr = substr.replaceAll("([\\p{N}\\p{L}])'(\\p{L})", "$1 '$2");
substr = substr.replaceAll("([^\\p{L}])'([^\\p{L}])", "$1 ' $2");
return substr;
}
StringBuilder sb = new StringBuilder();
appendInBetween(sb, str, 0, str.length());
return sb.toString();
}
static void appendInBetween
(StringBuilder resultStr,
String s,
int start,
int end
) { for (int i = start; i < end; ++i) {
char c = s.charAt(i);
// Check if c matches "([^\\p{L}\\p{N}\\p{Mn}_\\-<>'])".
|| "_\\-<>'".indexOf(c) != -1)) {
resultStr.append(' ');
resultStr.append(c);
resultStr.append(' ');
} else if (c == '\'' && i > 0 && i + 1 < s.length()) {
// We have a quote that's not at the beginning or end.
char b = s.charAt(i - 1);
char d = s.charAt(i + 1);
// If the 3 chars match "([\\p{N}\\p{L}])'(\\p{L})"
resultStr.append(' ');
resultStr.append(c);
// If the 3 chars match "([^\\p{L}])'([^\\p{L}])"
resultStr.append(' ');
resultStr.append(c);
resultStr.append(' ');
} else {
resultStr.append(c);
}
} else {
// Everything else, just append.
resultStr.append(c);
}
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCXRlc3QoImhlbGxvJ3MiKTsKCQl0ZXN0KCI7OzsxMjM1JzU0NTQhISIpOwoJCXRlc3QoIjs7OzEyMzUnTDQ1NCEhJyIpOwoJfQoJCglzdGF0aWMgdm9pZCB0ZXN0KFN0cmluZyBpbnB1dCkgewoJCVN0cmluZyByZWdleCA9IHJlZ2V4KGlucHV0KTsKCQlTdHJpbmcgcmVwbGFjZUluQmV0d2VlbiA9IHJlcGxhY2VJbkJldHdlZW4oaW5wdXQpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigicmVnZXg6ICIgKyByZWdleCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJyaWI6ICAgIiArIHJlcGxhY2VJbkJldHdlZW4pOwoJCVN5c3RlbS5vdXQucHJpbnRsbihyZWdleC5lcXVhbHMocmVwbGFjZUluQmV0d2VlbikpOwoJfQoJCglzdGF0aWMgU3RyaW5nIHJlZ2V4KFN0cmluZyBzdWJzdHIpIHsKCQlzdWJzdHIgPSBzdWJzdHIucmVwbGFjZUFsbCgiKFteXFxwe0x9XFxwe059XFxwe01ufV9cXC08PiddKSIsIiAkMSAiKTsKICAgIAlzdWJzdHIgPSBzdWJzdHIucmVwbGFjZUFsbCgiKFtcXHB7Tn1cXHB7TH1dKScoXFxwe0x9KSIsICIkMSAnJDIiKTsKICAgIAlzdWJzdHIgPSBzdWJzdHIucmVwbGFjZUFsbCgiKFteXFxwe0x9XSknKFteXFxwe0x9XSkiLCAiJDEgJyAkMiIpOwogICAgCXJldHVybiBzdWJzdHI7Cgl9CgkKCXN0YXRpYyBTdHJpbmcgcmVwbGFjZUluQmV0d2VlbihTdHJpbmcgc3RyKSB7CgkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgkJYXBwZW5kSW5CZXR3ZWVuKHNiLCBzdHIsIDAsIHN0ci5sZW5ndGgoKSk7CgkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cgl9CgkKc3RhdGljIHZvaWQgYXBwZW5kSW5CZXR3ZWVuKFN0cmluZ0J1aWxkZXIgcmVzdWx0U3RyLCBTdHJpbmcgcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwoKICAgIC8vIENoZWNrIGlmIGMgbWF0Y2hlcyAiKFteXFxwe0x9XFxwe059XFxwe01ufV9cXC08PiddKSIuCiAgICBpZiAoIShDaGFyYWN0ZXIuaXNMZXR0ZXIoYykKICAgICAgICAgIHx8IENoYXJhY3Rlci5pc0RpZ2l0KGMpCiAgICAgICAgICB8fCBDaGFyYWN0ZXIuZ2V0VHlwZShjKSA9PSBDaGFyYWN0ZXIuTk9OX1NQQUNJTkdfTUFSSwogICAgICAgICAgfHwgIl9cXC08PiciLmluZGV4T2YoYykgIT0gLTEpKSB7CiAgICAgIHJlc3VsdFN0ci5hcHBlbmQoJyAnKTsKICAgICAgcmVzdWx0U3RyLmFwcGVuZChjKTsKICAgICAgcmVzdWx0U3RyLmFwcGVuZCgnICcpOwogICAgfSBlbHNlIGlmIChjID09ICdcJycgJiYgaSA+IDAgJiYgaSArIDEgPCBzLmxlbmd0aCgpKSB7CiAgICAgIC8vIFdlIGhhdmUgYSBxdW90ZSB0aGF0J3Mgbm90IGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kLgoKICAgICAgY2hhciBiID0gcy5jaGFyQXQoaSAtIDEpOwogICAgICBjaGFyIGQgPSBzLmNoYXJBdChpICsgMSk7CgogICAgICBpZiAoKENoYXJhY3Rlci5pc0RpZ2l0KGIpIHx8IENoYXJhY3Rlci5pc0xldHRlcihiKSkgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKGQpKSB7CiAgICAgICAgLy8gSWYgdGhlIDMgY2hhcnMgbWF0Y2ggIihbXFxwe059XFxwe0x9XSknKFxccHtMfSkiCiAgICAgICAgcmVzdWx0U3RyLmFwcGVuZCgnICcpOwogICAgICAgIHJlc3VsdFN0ci5hcHBlbmQoYyk7CiAgICAgIH0gZWxzZSBpZiAoIUNoYXJhY3Rlci5pc0xldHRlcihiKSAmJiAhQ2hhcmFjdGVyLmlzTGV0dGVyKGQpKSB7CiAgICAgICAgLy8gSWYgdGhlIDMgY2hhcnMgbWF0Y2ggIihbXlxccHtMfV0pJyhbXlxccHtMfV0pIgogICAgICAgIHJlc3VsdFN0ci5hcHBlbmQoJyAnKTsKICAgICAgICByZXN1bHRTdHIuYXBwZW5kKGMpOwogICAgICAgIHJlc3VsdFN0ci5hcHBlbmQoJyAnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRTdHIuYXBwZW5kKGMpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBFdmVyeXRoaW5nIGVsc2UsIGp1c3QgYXBwZW5kLgogICAgICByZXN1bHRTdHIuYXBwZW5kKGMpOwogICAgfQogIH0KfQp9