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

Eli*_*ist 11 java regex

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

Boh*_*ian 5

它不能一次性完成,除非对连续退格的数量有实际限制(没有),并且有一个保证(没有)没有"额外"退格其中没有要删除的前一个字符.

这样做(它只有2条小线):

while (str.contains("\b"))
    str = str.replaceAll("^\b+|[^\b]\b", "");
Run Code Online (Sandbox Code Playgroud)

这处理输入的边缘情况,"x\b\by"在开始时有一个额外的退格,一旦第一个消耗,应该修剪x,只留下"y".


Luk*_*uke 5

这看起来像是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());
Run Code Online (Sandbox Code Playgroud)

正则表达式虽然很好,但并不适合每项任务。这种方式不如Bohemian 的简洁,但效率更高。在每种情况下使用堆栈都是 O(n),而像 Bohemian 的正则表达式方法在最坏的情况下是 O(n 2 )。