我需要对数字进行特殊处理(使用Java)来分割驼峰字符串。我尝试了一些正则表达但没有成功。以下示例:
SomeString -> ["Some", "String"]
SomeString1 -> ["Some", "String1"]
SomeString1Word -> ["Some", "String1Word"]
我应该使用什么样的正则表达式?
编辑:规则:按骆驼案例拆分但在数字介于小写和大写字母之间时不拆分。当数字是最后一个字符时,也不要分开。这符合我的要求。
答案 0 :(得分:3)
看起来你想在之前拆分以小写字母开头的任何大写字母,即之间的小写字母和大写字母,所以:
使用正则表达式分割:(?<=[a-z])(?=[A-Z])
或使用POSIX字符类:(?<=\p{Lower})(?=\p{Upper})
或者使用java.lang.Character类:(?<=\p{javaLowerCase})(?=\p{javaUpperCase})
或者使用Unicode Category类:(?<=\p{Ll})(?=\p{Lu})
(?<=X)
是一个零宽度的正面观察
(?=X)
是一个零宽度的正向前瞻。
演示
public static void main(String[] args) {
test("SomeString");
test("SomeString1");
test("SomeString1Word");
}
private static void test(String text) {
String regex = "(?<=\\p{Ll})(?=\\p{Lu})";
System.out.printf("%s -> %s%n", text, Arrays.toString(text.split(regex)));
}
输出
SomeString -> [Some, String]
SomeString1 -> [Some, String1]
SomeString1Word -> [Some, String1Word]
答案 1 :(得分:1)
str.split("(?<![0-9])(?=[A-Z])")
答案 2 :(得分:1)
幸运的是,我想我找到了你正在寻找的模式:
(?<=[a-z])(?=[A-Z])
试验:
"SomeString".split("(?<=[a-z])(?=[A-Z])") // [Some, String]
"SomeString1".split("(?<=[a-z])(?=[A-Z])") // [Some, String1]
"SomeString1Word".split("(?<=[a-z])(?=[A-Z])") // [Some, String1Word]