【问题标题】:How can I split string by a special character and ignore everything inside parentheses?如何用特殊字符拆分字符串并忽略括号内的所有内容?
【发布时间】:2019-02-11 15:56:38
【问题描述】:

我想用“/”分割字符串并忽略外括号内的“/”。

示例输入字符串:

"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)"

如果有内括号,则结果不正确。

【问题讨论】:

  • 虽然有人可以在这里给你一个正则表达式,但一般来说正则表达式不太适合嵌套内容。
  • 有时最好的方法就是编写一个解析器。这可能很棘手,但在这种情况下并不是很棘手,我不认为。

标签: java regex split


【解决方案1】:

这是一个可以满足您需求的解析器​​示例:

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;
}

你可以try it here

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多