拆分字符串 |和数字

Split String by | and numbers

假设我有以下字符串:

String one = "123|abc|123abc";
String two = "123|ab12c|abc|456|abc|def";
String three = "123|1abc|1abc1|456|abc|wer";
String four = "123|abc|def|456|ghi|jkl|789|mno|pqr";

如果我对它们进行拆分,我希望得到以下输出:

one = ["123|abc|123abc"];
two = ["123|ab12c|abc", "456|abc|def"];
three = ["123|1abc|1abc1", "456|abc|wer"];
four = ["123|abc|def", "456|ghi|jkl", "789|mno|pqr"];

字符串具有以下结构:

以 1 位或多位数字开头,后跟随机数(| 后跟随机数的字符)。

当一个 |只有数字被认为是新值。

更多示例:

In - 123456|xxxxxx|zzzzzzz|xa2314|xzxczxc|1234|qwerty
Out - ["123456|xxxxxx|zzzzzzz|xa2314|xzxczxc", "1234|qwerty"]

尝试了以下多种变体但不起作用:

value.split( "\|\d+|\d+" )

您可以匹配字符串中的部分而不是拆分:

\b\d+(?:\|(?!\d+(?:$|\|))[^|\r\n]+)*
  • \b一个单词边界
  • \d+ 匹配 1+ 个数字
  • (?:非捕获组
    • \|(?!\d+(?:$|\|)) 匹配 | 并且不仅断言数字直到下一个管道或字符串的结尾
    • [^|\r\n]+ 匹配除竖线或换行符以外的 1+ 个字符
  • )* 关闭非捕获组并可选择重复(使用+重复一次或多次以匹配至少一个管道字符)

Regex demo | Java demo

String regex = "\b\d+(?:\|(?!\d+(?:$|\|))[^|\r\n]+)+";
String string = "123|abc|def|456|ghi|jkl|789|mno|pqr";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(string);
List<String> matches = new ArrayList<String>();

while (m.find()) 
    matches.add(m.group());

for (String s : matches)
    System.out.println(s);

输出

123|abc|def
456|ghi|jkl
789|mno|pqr

您可以拆分 \|(?=\d+(?:\||$)):

List<String> nums = Arrays.asList(new String[] {
    "123|abc|123abc",
    "123|ab12c|abc|456|abc|def",
    "123|1abc|1abc1|456|abc|wer",
    "123|abc|def|456|ghi|jkl|789|mno|pqr"
});

for (String num : nums) {
    String[] parts = num.split("\|(?=\d+(?:\||$))");
    System.out.println(num + " => " + Arrays.toString(parts));
}

这会打印:

123|abc|123abc => [123|abc|123abc]
123|ab12c|abc|456|abc|def => [123|ab12c|abc, 456|abc|def]
123|1abc|1abc1|456|abc|wer => [123|1abc|1abc1, 456|abc|wer]
123|abc|def|456|ghi|jkl|789|mno|pqr => [123|abc|def, 456|ghi|jkl, 789|mno|pqr]