拆分字符串而不丢失拆分字符
Split string without losing split character
我想像这样拆分 Java 中的某个字符串,普通拆分函数拆分字符串时会丢失拆分字符:
String = "123{456]789[012*";
我想拆分 {,[,],*
个字符的字符串,但又不想丢失它们。我的意思是我想要这样的结果:
part 1 = 123{
part 2 = 456]
part 3 = 789[
part 4 = 012*
通常拆分函数是这样拆分的:
part 1 = 123
part 2 = 456
part 3 = 789
part 4 = 012
可能吗?
我想你正在寻找类似
的东西
String str = "123{456]789[012*";
String[] parts = new String[] {
str.substring(0,4), str.substring(4,8), str.substring(8,12),
str.substring(12)
};
System.out.println(Arrays.toString(parts));
输出是
[123{, 456], 789[, 012*]
您可以使用零宽度 lookahead/behind 表达式来定义匹配零长度字符串的正则表达式 在 您的目标字符之一和任何不是您的目标角色之一:
(?<=[{\[\]*])(?=[^{\[\]*])
将此表达式传递给 String.split
:
String[] parts = "123{456]789[012*".split("(?<=[{\[\]*])(?=[^{\[\]*])");
如果你有一个连续的分隔符块,这将在整个块的末尾拆分一次,即字符串 "123{456][789[012*"
将拆分为四个块 "123{", "456][", "789[", "012*"
。如果您只使用了第一部分(回顾)
(?<=[{\[\]*])
那么你会得到五个部分"123{", "456]", "[", "789[", "012*"
您可以使用 PatternMatcher
来查找拆分字符和拆分字符本身之后的下一个索引。
public static List<String> split(String string, String splitRegex) {
List<String> result = new ArrayList<String>();
Pattern p = Pattern.compile(splitRegex);
Matcher m = p.matcher(string);
int index = 0;
while (index < string.length()) {
if (m.find()) {
int splitIndex = m.end();
String splitString = m.group();
result.add(string.substring(index,splitIndex-1) + splitString);
index = splitIndex;
} else
result.add(string.substring(index));
}
return result;
}
示例代码:
public static void main(String[] args) {
System.out.println(split("123{456]789[012*","\{|\]|\[|\*"));
}
输出:
[123{, 456], 789[, 012*]
(?<={|\[|\]|\*)
String str = "123{456]789[012*";
String parts[] = str.split("(?<=\{|\[|\]|\*)");
System.out.println(Arrays.toString(parts));
输出:
[123{, 456], 789[, 012*]
我想像这样拆分 Java 中的某个字符串,普通拆分函数拆分字符串时会丢失拆分字符:
String = "123{456]789[012*";
我想拆分 {,[,],*
个字符的字符串,但又不想丢失它们。我的意思是我想要这样的结果:
part 1 = 123{
part 2 = 456]
part 3 = 789[
part 4 = 012*
通常拆分函数是这样拆分的:
part 1 = 123
part 2 = 456
part 3 = 789
part 4 = 012
可能吗?
我想你正在寻找类似
的东西String str = "123{456]789[012*";
String[] parts = new String[] {
str.substring(0,4), str.substring(4,8), str.substring(8,12),
str.substring(12)
};
System.out.println(Arrays.toString(parts));
输出是
[123{, 456], 789[, 012*]
您可以使用零宽度 lookahead/behind 表达式来定义匹配零长度字符串的正则表达式 在 您的目标字符之一和任何不是您的目标角色之一:
(?<=[{\[\]*])(?=[^{\[\]*])
将此表达式传递给 String.split
:
String[] parts = "123{456]789[012*".split("(?<=[{\[\]*])(?=[^{\[\]*])");
如果你有一个连续的分隔符块,这将在整个块的末尾拆分一次,即字符串 "123{456][789[012*"
将拆分为四个块 "123{", "456][", "789[", "012*"
。如果您只使用了第一部分(回顾)
(?<=[{\[\]*])
那么你会得到五个部分"123{", "456]", "[", "789[", "012*"
您可以使用 PatternMatcher
来查找拆分字符和拆分字符本身之后的下一个索引。
public static List<String> split(String string, String splitRegex) {
List<String> result = new ArrayList<String>();
Pattern p = Pattern.compile(splitRegex);
Matcher m = p.matcher(string);
int index = 0;
while (index < string.length()) {
if (m.find()) {
int splitIndex = m.end();
String splitString = m.group();
result.add(string.substring(index,splitIndex-1) + splitString);
index = splitIndex;
} else
result.add(string.substring(index));
}
return result;
}
示例代码:
public static void main(String[] args) {
System.out.println(split("123{456]789[012*","\{|\]|\[|\*"));
}
输出:
[123{, 456], 789[, 012*]
(?<={|\[|\]|\*)
String str = "123{456]789[012*";
String parts[] = str.split("(?<=\{|\[|\]|\*)");
System.out.println(Arrays.toString(parts));
输出:
[123{, 456], 789[, 012*]