拆分字符串 |和数字
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+ 个字符
)*
关闭非捕获组并可选择重复(使用+
重复一次或多次以匹配至少一个管道字符)
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]
假设我有以下字符串:
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+ 个字符
)*
关闭非捕获组并可选择重复(使用+
重复一次或多次以匹配至少一个管道字符)
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]