如何在 Java 中第 n 次出现特定分隔符时拆分字符串
How to split a string at the n'th occurrence of a specific separator in Java
我目前正在从服务器中拉取一个字符串,它在字段之间有分隔符,假设为“\u0003”,我想将字符串 at/after 第 31 个分隔符拆分为 2 个单独的字符串.这样的事情可能吗?如果是,怎么做?
你可以这样做:
Pattern pat = Pattern.compile("((?:[^\u0003]*\u0003){30}[^\u0003]*)\u0003(.*)");
Matcher matcher = pat.matcher(input);
if (matcher.matches()) {
String leftPart = matcher.group(1);
String rightPart = matcher.group(2);
}
该模式的工作原理如下:第一个捕获组找到一个恰好出现 30 次分隔符 \u0003
的子字符串;找到一个没有分隔符的子串,后跟一个分隔符的子模式重复 30 次,然后是另一个没有分隔符的子串。这后面必须跟一个分隔符(第 31 个分隔符),第二个捕获组包含字符串中剩余的所有内容。 (请注意,以 (?:
开头的带括号的子模式是非捕获组,不计入 group()
方法使用的编号。)
另一种方法是使用 split()
方法。但是,这需要您自己重建左侧部分,方法是连接结果数组的前 31 个元素(首先检查是否确实有那么多元素),然后插入分隔符。不幸的是,因为你在 Android,你不能使用 String.join()
方法来帮助解决这个问题,因为这是在 Java 8 中添加的并且 Android 仍然卡住了Java 6 和 Java 7 之间的某处。
注意:我已经测试过了,它按预期工作。
我目前正在从服务器中拉取一个字符串,它在字段之间有分隔符,假设为“\u0003”,我想将字符串 at/after 第 31 个分隔符拆分为 2 个单独的字符串.这样的事情可能吗?如果是,怎么做?
你可以这样做:
Pattern pat = Pattern.compile("((?:[^\u0003]*\u0003){30}[^\u0003]*)\u0003(.*)");
Matcher matcher = pat.matcher(input);
if (matcher.matches()) {
String leftPart = matcher.group(1);
String rightPart = matcher.group(2);
}
该模式的工作原理如下:第一个捕获组找到一个恰好出现 30 次分隔符 \u0003
的子字符串;找到一个没有分隔符的子串,后跟一个分隔符的子模式重复 30 次,然后是另一个没有分隔符的子串。这后面必须跟一个分隔符(第 31 个分隔符),第二个捕获组包含字符串中剩余的所有内容。 (请注意,以 (?:
开头的带括号的子模式是非捕获组,不计入 group()
方法使用的编号。)
另一种方法是使用 split()
方法。但是,这需要您自己重建左侧部分,方法是连接结果数组的前 31 个元素(首先检查是否确实有那么多元素),然后插入分隔符。不幸的是,因为你在 Android,你不能使用 String.join()
方法来帮助解决这个问题,因为这是在 Java 8 中添加的并且 Android 仍然卡住了Java 6 和 Java 7 之间的某处。
注意:我已经测试过了,它按预期工作。