我有一个由用户键盘类型构造的字符串,因此它可能包含'\b'
字符(退格).
我想清理字符串,以便它不包含'\b'
字符,以及它们要删除的字符.例如,字符串:
String str = "\bHellow\b world!!!\b\b\b.";
Run Code Online (Sandbox Code Playgroud)
应打印为:
Hello world.
Run Code Online (Sandbox Code Playgroud)
我用replaceAll尝试过一些东西,我现在拥有的是:
System.out.println(str.replaceAll("^\b+|.\b+", ""));
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
你好,世界!!.
单一'\b'
处理正常,但忽略它的倍数.
那么,我可以用Java的正则表达式来解决它吗?
编辑:
我已经看到了这个答案,但它似乎不适用于java的replaceAll.
也许我错过了逐字字符串的东西......
它不能一次性完成,除非对连续退格的数量有实际限制(没有),并且有一个保证(没有)没有"额外"退格其中没有要删除的前一个字符.
这样做(它只有2条小线):
while (str.contains("\b"))
str = str.replaceAll("^\b+|[^\b]\b", "");
Run Code Online (Sandbox Code Playgroud)
这处理输入的边缘情况,"x\b\by"
在开始时有一个额外的退格,一旦第一个消耗,应该修剪x
,只留下"y"
.
Stack<Character> stack = new Stack<Character>();
// for-each character in the string
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// push if it's not a backspace
if (c != '\b') {
stack.push(c);
// else pop if possible
} else if (!stack.empty()) {
stack.pop();
}
}
// convert stack to string
StringBuilder builder = new StringBuilder(stack.size());
for (Character c : stack) {
builder.append(c);
}
// print it
System.out.println(builder.toString());
Run Code Online (Sandbox Code Playgroud)
正则表达式虽然很好,但并不适合每项任务。这种方式不如Bohemian 的简洁,但效率更高。在每种情况下使用堆栈都是 O(n),而像 Bohemian 的正则表达式方法在最坏的情况下是 O(n 2 )。