如何将字符串拆分成组?

时间:2013-06-29 18:04:48

标签: java string tokenize

我正在尝试解决如何将字符串拆分成组的问题。我不认为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,但我还没有完全掌握它。

3 个答案:

答案 0 :(得分: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));
    }

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

修改:

要捕获)(之间的内容,只需将正则表达式替换为此\\)([^\\(]+)\\(

答案 1 :(得分:2)

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

这是我的建议......我假设输入的格式总是像followig

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

[此处运算符可以不同,+只显示连接)。

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

  1. 使用堆栈
  2. 在阅读原始字符串时将所有字符推入堆栈
  3. 现在通过使用以下逻辑从堆栈中逐个弹出 一个。如果get)开始添加到字符串 湾如果get(添加到字符串,现在你得到一个标记。将标记添加到数组中。 C。获得后(跳到下一个)。
  4. N.B。它只是和原始思维的伪代码。

答案 2 :(得分: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数组中获得额外的字符串,但您可以毫不费力地解决这个问题。

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