拉丁的传说
您可以使用“查找”和“查找”。就像这样:System.out.println(Arrays.toString("a;b;c;d".split("(?<=;)")));System.out.println(Arrays.toString("a;b;c;d".split("(?=;)")));System.out.println(Arrays.toString("a;b;c;d".split("((?<=;)|(?=;))")));你会得到:[a;, b;, c;, d][a, ;b, ;c, ;d][a, ;, b, ;, c, ;, d]最后一个是你想要的。((?<=;)|(?=;))等于在前面选择一个空字符。;或之后;.希望这能帮上忙。编辑法比安·斯蒂格关于可读性的评论是有效的。对于RegEx来说,可读性始终是个问题。有一件事,我帮助缓解了这一点,就是创建一个变量,其名称表示regex所做的事情,并使用Java字符串格式进行帮助。就像这样:static public final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";...public void someMethod() {...final String[] aEach = "a;b;c;d".split(String.format(WITH_DELIMITER, ";"));...}...这有点帮助。-D
慕仙森
您想要使用查找器,并在零宽度匹配上拆分。以下是一些例子:public class SplitNDump {
static void dump(String[] arr) {
for (String s : arr) {
System.out.format("[%s]", s);
}
System.out.println();
}
public static void main(String[] args) {
dump("1,234,567,890".split(","));
// "[1][234][567][890]"
dump("1,234,567,890".split("(?=,)"));
// "[1][,234][,567][,890]"
dump("1,234,567,890".split("(?<=,)"));
// "[1,][234,][567,][890]"
dump("1,234,567,890".split("(?<=,)|(?=,)"));
// "[1][,][234][,][567][,][890]"
dump(":a:bb::c:".split("(?=:)|(?<=:)"));
// "[][:][a][:][bb][:][:][c][:]"
dump(":a:bb::c:".split("(?=(?!^):)|(?<=:)"));
// "[:][a][:][bb][:][:][c][:]"
dump(":::a::::b b::c:".split("(?=(?!^):)(?<!:)|(?!:)(?<=:)"));
// "[:::][a][::::][b b][::][c][:]"
dump("a,bb:::c d..e".split("(?!^)\\b"));
// "[a][,][bb][:::][c][ ][d][..][e]"
dump("ArrayIndexOutOfBoundsException".split("(?<=[a-z])(?=[A-Z])"));
// "[Array][Index][Out][Of][Bounds][Exception]"
dump("1234567890".split("(?<=\\G.{4})"));
// "[1234][5678][90]"
// Split at the end of each run of letter
dump("Boooyaaaah! Yippieeee!!".split("(?<=(?=(.)\\1(?!\\1))..)"));
// "[Booo][yaaaa][h! Yipp][ieeee][!!]"
}}是的,这是最后一个模式中三层嵌套的断言。相关问题JavaSplit正在吞噬我的角色。在字符串拆分中能使用零宽度匹配正则表达式吗?如何用Java将CamelCase转换为人类可读的名称?后视中的反向引用另见正则表达式.info/查找