4

我正在尝试解决如何将字符串分成组。我不认为该split(regex)方法本身就足够了。

我有String complexStatement = "(this && that)||(these&&those)||(me&&you)";并且我想要一个具有这种形式的数组:

"(this && that)","(these&&those)","(me&&you)""

如果我有,"(5+3)*(2+5)+(9)"那么我想要“(5+3)”、“(2+5)”、“(9)”。(如果您能以某种方式保留加入
信息,则可以加分,例如) *,+,||

这对任意字符串输入是否可行?我正在玩 StringTokenizer 但我还没有完全掌握它。

4

3 回答 3

4

您可以使用以下代码:

    String str = "(this && that)\",\"(these&&those)\",\"(me&&you)";
    Pattern pattern = Pattern.compile("\\(([^\\)]+)\\)");
    Matcher m = pattern.matcher(str);
    while (m.find()){
        System.out.println(m.group(0));
    }

\\(([^\\)]+)\\)会在括号内挖掘你的任何东西,看起来像你想要的!:

编辑:

要捕获之间的内容)(只需用这个替换正则表达式\\)([^\\(]+)\\(

于 2013-06-29T18:10:41.830 回答
2

我认为您最好实现解析,而不是依赖任何现成的方法。

这是我的建议...我假设输入的格式将始终如下所示

(value1+operator+value2)+operator+(value3+operator+value4)+........

[这里的运算符可以不同,+ 只是显示串联)。

如果上述假设为真,那么您可以执行以下操作。

  1. 使用堆栈
  2. 在读取原始字符串时将所有字符推入堆栈
  3. 现在使用以下逻辑从堆栈中一一弹出。if get ) 开始添加到字符串 b。如果得到(添加到字符串,现在你得到一个令牌。将令牌添加到数组中。c. 获取后(跳到下一个)。

注意,这只是具有原始思维的伪代码。

于 2013-06-29T18:14:00.490 回答
1

如果您想捕获由最外层的括号定义的组,那么您就处于正则表达式的世界之外,并且需要解析输入。StinePike 的方法很好;另一个(杂乱无章的伪代码)如下:

insides = []
outsides = []
nesting_level = 0
string = ""
while not done_reading_input():
    char = get_next_char()
    if nesting_level > 0 or char not in ['(', ')']:
        string += char
    if char == '('
        if nesting_level == 0:
            outsides.add(string)
            string = ""
        nesting_level += 1
    elif char == ')':
        nesting_level -= 1
        if nesting_level == 0:
            insides.add(string)
            string = ""

如果输入中的第一个字符是 '(',您将在outsides数组中获得一个额外的字符串,但您可以轻松修复它。

如果您对嵌套括号感兴趣,那么您将不会只生成两个数组作为输出;你需要一棵树。

于 2013-06-29T20:06:10.517 回答