到第n破折号后拆分,使用常规表达式找到要分裂的点并呼叫substring()
。只需将{}
之间的数字更改为合适的n值即可。
(?:[^-]*-){2}
这里是演示所有3个n:
String input = "BPI-1111-2203-4493";
Matcher m;
// Split on 1st dash
m = Pattern.compile("(?:[^-]*-){1}").matcher(input);
if (m.find())
System.out.printf("%s, %s%n", input.substring(0, m.end() - 1),
input.substring(m.end()));
// Split on 2nd dash
m = Pattern.compile("(?:[^-]*-){2}").matcher(input);
if (m.find())
System.out.printf("%s, %s%n", input.substring(0, m.end() - 1),
input.substring(m.end()));
// Split on 3rd dash
m = Pattern.compile("(?:[^-]*-){3}").matcher(input);
if (m.find())
System.out.printf("%s, %s%n", input.substring(0, m.end() - 1),
input.substring(m.end()));
输出:
BPI, 1111-2203-4493
BPI-1111, 2203-4493
BPI-1111-2203, 4493
可以很容易地变成一个可重用的helper方法:
private static String[] split(String input, char ch, int n) {
if (n <= 0)
throw new IllegalArgumentException("n must be >0");
Matcher m = Pattern.compile("(?:[^" + ch + "]*" + ch + "){" + n + "}").matcher(input);
if (! m.find())
return new String[] { input };
return new String[] { input.substring(0, m.end() - 1),
input.substring(m.end()) };
}
测试:
String input = "BPI-1111-2203-4493";
System.out.println(Arrays.toString(split(input, '-', 1)));
System.out.println(Arrays.toString(split(input, '-', 2)));
System.out.println(Arrays.toString(split(input, '-', 3)));
System.out.println(Arrays.toString(split(input, '-', 4)));
输出:
[BPI, 1111-2203-4493]
[BPI-1111, 2203-4493]
[BPI-1111-2203, 4493]
[BPI-1111-2203-4493]
也可以按照suggestion by Jon Skeet和使用indexOf()
:
private static String[] split(String input, char ch, int n) {
if (n <= 0)
throw new IllegalArgumentException("n must be >0");
int idx = 0;
for (int i = 0; i < n; i++)
if ((idx = input.indexOf(ch, idx) + 1) == 0)
return new String[] { input };
return new String[] { input.substring(0, idx - 1),
input.substring(idx) };
}
'indexOf'和'substring'? –
@JonSkeet如果我知道哪个'-',那很容易。但是“_nth'-'_” – Hackerdarshi
你可以多次调用'indexOf',每次传入前一个调用的结果来移动。 (查看'indexOf'的超载,它需要一个初始索引。) –