Java正则表达式 - 擦除字符后跟\ b(退格)

时间:2015-05-11 16:49:56

标签: java regex

我有一个由用户键盘类型构造的字符串,因此它可能包含'\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。
也许我错过了逐字字符串......

4 个答案:

答案 0 :(得分:5)

除非对连续退格的数量有实际限制(没有),否则不能一次完成,并且有一个保证(没有)没有“额外的“没有先前字符要删除的退格键。

这就完成了工作(它只有两条小线):

while (str.contains("\b"))
    str = str.replaceAll("^\b+|[^\b]\b", "");

这会处理像"x\b\by"这样的输入的边缘情况,它在开始时有一个额外的退格,应该在第一个消耗x后进行修剪,只留下"y"。< / p>

答案 1 :(得分:4)

这看起来像是Stack的工作!

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.

目前只有通用的正则表达式解决方案不在正则表达式范围内。