我有一个由用户键盘类型构造的字符串,因此它可能包含'\b'
个字符(退格)。
我想清理字符串,以便它不包含'\b'
个字符,以及它们要删除的字符。例如,字符串:
String str = "\bHellow\b world!!!\b\b\b.";
应打印为:
Hello world.
我用replaceAll尝试过一些东西,我现在拥有的是:
System.out.println(str.replaceAll("^\b+|.\b+", ""));
打印哪些:
Hello world !!。
单'\b'
处理正常,但忽略它的倍数。
那么,我可以用Java的正则表达式来解决它吗?
修改
我看过this回答,但它似乎不适用于java的replaceAll。
也许我错过了逐字字符串......
答案 0 :(得分:5)
除非对连续退格的数量有实际限制(没有),否则不能一次完成,并且有一个保证(没有)没有“额外的“没有先前字符要删除的退格键。
这就完成了工作(它只有两条小线):
while (str.contains("\b"))
str = str.replaceAll("^\b+|[^\b]\b", "");
这会处理像"x\b\by"
这样的输入的边缘情况,它在开始时有一个额外的退格,应该在第一个消耗x
后进行修剪,只留下"y"
。< / p>
答案 1 :(得分:4)
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());
正则表达式,虽然很好,但并不适合每项任务。这种方法不像Bohemian's那样简洁,但效率更高。在每种情况下使用堆栈都是O(n),而在最坏的情况下,像波希米亚语这样的正则表达式方法是O(n 2 )。
答案 2 :(得分:0)
如果我正确理解了这个问题,这就是你问题的解决方案:
String str = "\bHellow\b world!!!\b\b\b.";
System.out.println(str.replace(".?\\\b", ""));
答案 3 :(得分:0)
这是一个很好的谜语。我认为您可以使用正则表达式删除相同数量的相同重复字符和\b
s (即对于您的特定输入字符串):
String str = "\bHellow\b world!!!\b\b\b.";
System.out.println(str.replaceAll("^\b+|(?:([^\b])(?=\\1*+(\\2?+\b)))+\\2", ""));
这是How can we match a^n b^n with Java regex?的改编。
请参阅IDEONE demo,我在其中添加.replace("\b","<B>"));
以查看是否还有\b
个。
输出:
Hello world.
目前只有通用的正则表达式解决方案不在正则表达式范围内。