我认为这是一个简单的问题,但我无法找到一个简单的解决方案(例如,少于10行代码:)
我有一个String
,例如"thisIsMyString"
,我需要将其转换为String[] {"this", "Is", "My", "String"}
。
请注意第一个字母不是大写字母。
答案 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]
修改正则表达式也可以减少位数。