Java:找到大写字母时拆分字符串

时间:2010-09-20 14:55:53

标签: java regex string

我认为这是一个简单的问题,但我无法找到一个简单的解决方案(例如,少于10行代码:)

我有一个String,例如"thisIsMyString",我需要将其转换为String[] {"this", "Is", "My", "String"}

请注意第一个字母不是大写字母。

7 个答案:

答案 0 :(得分:99)

你可以使用零宽度正向前瞻的正则表达式 - 它找到大写字母但不包括它们到分隔符中:

String s = "thisIsMyString";
String[] r = s.split("(?=\\p{Upper})");

Y(?=X)匹配Y后跟X,但不包括X匹配。因此(?=\\p{Upper})匹配空序列后跟大写字母,split将其用作分隔符。

有关Java regexp语法的更多信息,请参阅javadoc

编辑:顺便说一下,它也不适用于thisIsMyÜberString。对于非ASCII大写字母,您需要Unicode大写字符类而不是POSIX 1:

String[] r = s.split("(?=\\p{Lu})");

答案 1 :(得分:17)

String[] camelCaseWords = s.split("(?=[A-Z])");

答案 2 :(得分:11)

对于任何想知道如何分割字符串可能以大写字符开头的模式的人:

String s = "ThisIsMyString";
String[] r = s.split("(?<=.)(?=\\p{Lu})");
System.out.println(Arrays.toString(r));

给出:[This,Is,My,String]

答案 3 :(得分:5)

由于String::split采用正则表达式,因此您可以使用预测:

String[] x = "thisIsMyString".split("(?=[A-Z])");

答案 4 :(得分:0)

试试这个;

static Pattern p = Pattern.compile("(?=\\p{Lu})");
String[] s1 = p.split("thisIsMyFirstString");
String[] s2 = p.split("thisIsMySecondString");

...

答案 5 :(得分:0)

这个正则表达式将在Caps上分开,省略第一个。所以它应该适用于驼峰式和适当的情况。

(?<=.)(?=(\\p{Upper}))

TestText = Test, Text
thisIsATest = this, Is, A, Test

答案 6 :(得分:0)

一个简单的scala / java建议,不会在整个大写字符串(例如 NYC )上分割:

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]

修改正则表达式也可以减少位数。

相关问题