Подтвердить что ты не робот

Java: разделите строку, когда найдена заглавная буква

Я думаю, что это простой вопрос, но я не могу найти простое решение (скажем, менее 10 строк кода:)

У меня есть String, например "thisIsMyString", и мне нужно преобразовать его в String[] {"this", "Is", "My", "String"}.

Обратите внимание, что первая буква не прописная.

4b9b3361

Ответ 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]

Измените регулярное выражение, чтобы сократить также цифры.