为了账号安全,请及时绑定邮箱和手机立即绑定

如何用特殊字符拆分字符串并忽略括号内的所有内容?

如何用特殊字符拆分字符串并忽略括号内的所有内容?

倚天杖 2022-06-15 16:58:40
我想用“/”分割字符串并忽略外括号内的“/”。示例输入字符串:"Apple 001/(Orange (002/003) ABC)/Mango 003 )/( ASDJ/(Watermelon )004)/Apple 002 ASND/(Mango)"字符串数组中的预期输出:["Apple 001", "(Orange (002/003) ABC)", "Mango 003 )/( ASDJ", "(Watermelon )004)", "Apple 002 ASND", "(Mango)"]这是我的正则表达式:\/(?=(?:[^\(\)]*\([^\(\)]*\))*[^\(\)]*$)但它只能支持这样的简单字符串:"Apple 001/(Orange 002/003 ABC)/Mango 003 ASDJ/(Watermelon 004)/Apple 002 ASND/(Mango)"如果有内括号,则结果不正确。
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

这是一个可以实现您需求的解析器示例:


public static List<String> splitter(String input) {

    int nestingLevel=0;

    StringBuilder currentToken=new StringBuilder();

    List<String> result = new ArrayList<>();

    for (char c: input.toCharArray()) {

        if (nestingLevel==0 && c == '/') { // the character is a separator !

            result.add(currentToken.toString());

            currentToken=new StringBuilder();

        } else {

            if (c == '(') { nestingLevel++; }

            else if (c == ')' && nestingLevel > 0) { nestingLevel--; }


            currentToken.append(c);

        }

    }

    result.add(currentToken.toString());

    return result;

}

你可以在这里试试。


请注意,它不会导致您发布的预期输出,但我不确定您遵循什么算法来获得这样的结果。特别是我已经确保没有“负嵌套级别”,所以对于初学者来说,/in"Mango 003 )/( ASDJ"被认为在括号之外并被解析为分隔符。


无论如何,我确信您可以比正则表达式答案更容易地调整我的答案,我的答案的全部意义在于表明编写解析器来处理此类问题通常比费心尝试制作正则表达式更现实。


查看完整回答
反对 回复 2022-06-15
  • 1 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号