如何将一个字符串分成多个组?

5
我正在尝试将字符串分组。我认为单独使用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)"。
(如果您能保留join信息,例如*,+,||,则会获得额外积分) 对于任意字符串输入,这是否可能? 我正在尝试使用StringTokenizer,但我还没有完全掌握它。

2
你想保留只有括号内的内容吗?嵌套的括号怎么办?不平衡的括号呢? - Ray Toal
@RayToal 我不确定。我认为如果我可以在括号外部分割,我可以逐步向内循环处理每个括号?或者这样做太天真了? - AncientSwordRage
3个回答

5
您可以使用下面的代码:
    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));
    }
\\(([^\\)]+)\\)可以帮助你获取括号内的任何内容,看起来就像你想要的! 编辑: 为了捕获在)(之间的内容,只需将正则表达式替换为\\)([^\\(]+)\\(

太好了!我正在尝试创建一个正则表达式来匹配)(之间的任何内容,以便它可以捕获),()&&(。我已经尝试过"(?:\\(.*\\)(.+)\\(.*\\))?"但是没有成功。我错在哪里?此外,它似乎匹配了<b>(</b>1),(2),<b>(</b>3<b>)</b>的开头和结尾,为什么会这样,我该如何解决? - AncientSwordRage

2

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

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

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

[此处运算符可以不同,+仅用于显示字符串连接]。

如果上述假设成立,则可以执行以下操作。

  1. 使用堆栈
  2. 在读取原始字符串时,将所有字符推送到堆栈中
  3. 现在通过以下逻辑从堆栈中逐个弹出 a. 如果获得),开始添加到一个字符串中 b. 如果获得(将其添加到字符串中,现在您获得一个标记。 将标记添加到数组中。 c. 在获取(之后,跳过到下一个)

N.B.这只是具有原始思维的伪代码。


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数组中获得一个额外的字符串,但是您可以轻松解决这个问题。如果您对嵌套括号感兴趣,则输出不仅是两个数组; 您需要一棵树。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接