用于拆分 space、特殊字符、数字的 Guava 拆分器
Guava splitter for splitting on space,special character, digit
我们可以创建一个按以下方式拆分的番石榴拆分器吗:
abc8 => abc + 8
a-b => a + b
a b => a + b
a,b => a + b
abc8 d => abc + 8 + d
?
我想这就是你想要的。我不确定是否有更有效的方法。
String text = "abc-de+f8gsdf12345=";
boolean lastWasLetter = false;
boolean lastWasNumber = false;
for(int i = text.length()-1; i >= 0; i--) {
if(!Character.isLetterOrDigit(text.charAt(i))) {
text = text.substring(0, i) + "-" + text.substring(i+1); // Replace special char with "-".
lastWasLetter = false;
lastWasNumber = false;
} else if(Character.isLetter(text.charAt(i))) {
if(lastWasNumber) {
text = text.substring(0, i+1) + "-" + text.substring(i+1); // Add a "-" between a digit and a letter.
}
lastWasLetter = true;
lastWasNumber = false;
} else { // The char is a digit.
if(lastWasLetter) {
text = text.substring(0, i+1) + "-" + text.substring(i+1); // Add a "-" between a digit and a letter.
}
lastWasLetter = false;
lastWasNumber = true;
}
}
System.out.println("Converted text: " + text);
System.out.println("Splitted text text: ");
String[] parts = text.split("-");
for(String part : parts) {
System.out.println(part);
}
对于这种事情,您甚至不需要 Guava。一个简单的 String.split 就可以了。使用以下正则表达式:
(?=\d)|\W
例如:
"abc8".split("(?=\d)|\W")
如果您必须使用 Guava 来解决问题,请注意 Guava Splitter 是 buggy on look-ahead operations。作为变通方法,您可以将 space 字符附加到您的 String 并忽略拆分结果中的最后一个匹配项:
Splitter.onPattern("(?=\d)|\W").split("abc8 ") // result: [abc, 8, ]
我们可以创建一个按以下方式拆分的番石榴拆分器吗:
abc8 => abc + 8
a-b => a + b
a b => a + b
a,b => a + b
abc8 d => abc + 8 + d
?
我想这就是你想要的。我不确定是否有更有效的方法。
String text = "abc-de+f8gsdf12345=";
boolean lastWasLetter = false;
boolean lastWasNumber = false;
for(int i = text.length()-1; i >= 0; i--) {
if(!Character.isLetterOrDigit(text.charAt(i))) {
text = text.substring(0, i) + "-" + text.substring(i+1); // Replace special char with "-".
lastWasLetter = false;
lastWasNumber = false;
} else if(Character.isLetter(text.charAt(i))) {
if(lastWasNumber) {
text = text.substring(0, i+1) + "-" + text.substring(i+1); // Add a "-" between a digit and a letter.
}
lastWasLetter = true;
lastWasNumber = false;
} else { // The char is a digit.
if(lastWasLetter) {
text = text.substring(0, i+1) + "-" + text.substring(i+1); // Add a "-" between a digit and a letter.
}
lastWasLetter = false;
lastWasNumber = true;
}
}
System.out.println("Converted text: " + text);
System.out.println("Splitted text text: ");
String[] parts = text.split("-");
for(String part : parts) {
System.out.println(part);
}
对于这种事情,您甚至不需要 Guava。一个简单的 String.split 就可以了。使用以下正则表达式:
(?=\d)|\W
例如:
"abc8".split("(?=\d)|\W")
如果您必须使用 Guava 来解决问题,请注意 Guava Splitter 是 buggy on look-ahead operations。作为变通方法,您可以将 space 字符附加到您的 String 并忽略拆分结果中的最后一个匹配项:
Splitter.onPattern("(?=\d)|\W").split("abc8 ") // result: [abc, 8, ]