我试图使用regex将字符串分成两部分。第一部分应该是所有的数字,包括中间的点,直到最后一个点。数组的第二部分应该是最后一位数字,不包括点。为什么这个regex没有得到预期的结果?
String str = "12.345.678.90.111.213.1";
String[] arr = str.split("[^\\.]([^.]*)$" , 2);
预期输出:
[12.345.678.90.111.213,1]
实际输出:
[12.345.678.90.111.213., ]
你需要的regex只有 匹配 最后一个点,同时确保后面没有更多的点。
要做到这一点,您需要匹配需要转义的点,因此使用 \.
,然后使用一个零宽度的正向查找来验证字符串的其余部分是否有一个点,即使用 (?=[^.]+$)
或者,使用零宽度的负值前瞻来确保它找不到点,即 (?!.*\.)
我更喜欢第一种,所以使用 \.(?=[^.]+$)
,在Java中的意思是 "\\.(?=[^.]+$)"
str = "12.345.678.90.111.213.1";
arrMatch = str.match(/(.*)\.(.*)/);
arr = [arrMatch[1], arrMatch[2]];
console.log(arr);
str = "12.345.678.90.111.213.1";
arr = str.split(/(.*)\.(.*)/).filter(el => {
return !!el;
})
console.log(arr);
与其使用regex,你可以很容易地使用 String::substring
如下图所示。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String str = "12.345.678.90.111.213.1";
if (str.lastIndexOf(".") != -1) {
String[] arr = { str.substring(0, str.lastIndexOf(".")), str.substring(str.lastIndexOf(".") + 1) };
System.out.println(Arrays.toString(arr));
}
}
}
产出:
[12.345.678.90.111.213, 1]