Java: разделите строку, когда найдена заглавная буква
Я думаю, что это простой вопрос, но я не могу найти простое решение (скажем, менее 10 строк кода:)
У меня есть String
, например "thisIsMyString"
, и мне нужно преобразовать его в String[] {"this", "Is", "My", "String"}
.
Обратите внимание, что первая буква не прописная.
Ответы
Ответ 1
Вы можете использовать регулярное выражение с положительным представлением нулевой ширины - он находит прописные буквы, но не включает их в разделитель:
String s = "thisIsMyString";
String[] r = s.split("(?=\\p{Upper})");
Y(?=X)
соответствует Y
, за которым следует X
, но не включает X
в соответствие. Таким образом, (?=\\p{Upper})
соответствует пустой последовательности, за которой следует прописная буква, а split
использует ее как разделитель.
Подробнее о синтаксисе Java regexp см. javadoc.
EDIT: Кстати, он не работает с thisIsMyÜberString
тоже. Для прописных букв, отличных от ASCII, вам нужен только символ верхнего регистра символов Unicode вместо POSIX one:
String[] r = s.split("(?=\\p{Lu})");
Ответ 2
String[] camelCaseWords = s.split("(?=[A-Z])");
Ответ 3
Для любого, кто задается вопросом, как шаблон будет, когда String to split может начинаться с символа верхнего регистра:
String s = "ThisIsMyString";
String[] r = s.split("(?<=.)(?=\\p{Lu})");
System.out.println(Arrays.toString(r));
дает: [This, Is, My, String]
Ответ 4
Так как String::split
принимает регулярное выражение, вы можете использовать прогноз:
String[] x = "thisIsMyString".split("(?=[A-Z])");
Ответ 5
Попробуйте это;
static Pattern p = Pattern.compile("(?=\\p{Lu})");
String[] s1 = p.split("thisIsMyFirstString");
String[] s2 = p.split("thisIsMySecondString");
...
Ответ 6
Это регулярное выражение будет разделено на Caps, опустив первое. Поэтому он должен работать на верблюжьем футляре и в надлежащем случае.
(?<=.)(?=(\\p{Upper}))
TestText = Test, Text
thisIsATest = this, Is, A, Test
Ответ 7
Простое предложение по scala/java, которое не разбивается на строчные буквы целиком, как в Нью-Йорке:
def splitAtMiddleUppercase(token: String): Iterator[String] = {
val regex = """[\p{Lu}]*[^\p{Lu}]*""".r
regex.findAllIn(token).filter(_ != "") // did not find a way not to produce empty strings in the regex. Open to suggestions.
}
проверить с помощью:
val examples = List("catch22", "iPhone", "eReplacement", "TotalRecall", "NYC", "JGHSD87", "interÜber")
for( example <- examples) {
println(example + " -> " + splitAtMiddleUppercase(example).mkString("[", ", ", "]"))
}
это производит:
catch22 -> [catch22]
iPhone -> [i, Phone]
eReplacement -> [e, Replacement]
TotalRecall -> [Total, Recall]
NYC -> [NYC]
JGHSD87 -> [JGHSD87]
interÜber -> [inter, Über]
Измените регулярное выражение, чтобы сократить также цифры.