如何使用正则表达式将字符串按最后一个字符拆分?

How can i split a String by last char with a regex?

我可以这样做:

String s = "dsad.dd.ada....png";
int i = s.lastIndexOf('.');
String[] arr = {s.substring(0, i), s.substring(i + 1)};
System.out.println(Arrays.toString(arr));

输出:

[dsad.dd.ada..., png]

但我想了解如何使用正则表达式来实现。

String s = "dsad.dd.ada....png";
String[] arr = s.split("REGEX");
System.out.println(Arrays.toString(arr));

使用 lookahead 检查最后一个 .

"\.(?=[^.]*$)"

在每个 . 看,如果前面只有 characters, that are not .,直到 $ 结束。如果是,则匹配 .

Test at regex101.com; Regex FAQ

您可以使用 lookahead 断言。 (?= ... ) 是一个零宽度断言,它不 "consume" 字符串中的任何字符,而仅断言是否可能匹配。

下面的正则表达式首先匹配一个文字点然后使用前瞻断言后面是除点之外的任何字符 "zero or more" 次,然后是字符串的结尾。

String s = "dsad.dd.ada....png";
String[] arr = s.split("\.(?=[^.]*$)");
System.out.println(Arrays.toString(arr)); //=> [dsad.dd.ada..., png]

这个适用于您可能想到的所有拆分标准。

public static void main(final String[] args) {
    String test = "dsad.dd.ada....png";
    String breakOn = "\.";
    String pattern = breakOn + "(?!.*" + breakOn + ".*)";
    System.out.println(Arrays.toString(test.split(pattern, 2)));
}

输出: [dsad.dd.ada..., png]