无法正确拆分特定字符串

时间:2014-03-03 01:31:56

标签: java string split

您好,这是我第一次在这里发帖,我确实环顾四周,找不到我遇到的问题的答案。

我需要将此字符串转换为两个字符串:

"R(rndInt[-10,10]),R(rndInt[-10,10])"

 "R(rndInt[-10,10])" "R(rndInt[-10,10])"

总而言之,我正在修改游戏并创建自己的脚本语言供人们使用。我创建了一个基于类/方法的结构(注释:http://pastie.org/8825346)。现在我正在努力使它可以在方法中使用Classes / Methods(适用于单参数方法)。

我现在遇到的问题是拆分该字符串,因为它有多个逗号。我真的想不出一种方法来分裂它而不会引起问题。

有人可以帮忙吗?我现在很难过。

修改:已解决!

前瞻断言方法有效!到目前为止我还没有听说过。

我忘了提到我不能使用“R”。 R引用一个Class,它可以有不同的名称。

我通过找出“)”和“(”通过对字符串进行子串。

之间的内容找到了该问题的解决方案。
String cName=oldStr.substring(oldStr.indexOf("),")+2);
cName=cName.substring(0, oldStr.indexOf("("));
System.out.println("CNAME:"+cName);
String[] test = oldStr.split(",(?="+cName+")");

谢谢你们,我非常感谢你的帮助:)。

4 个答案:

答案 0 :(得分:1)

为什么不定位相关的逗号:

str.split("\\),R");   // as a simple Regexp

更新----

正如评论所指出并由@Reimeus回答的那样,正则表达式将最终结束:

str.split(",(?=R)");

答案 1 :(得分:1)

您可以使用lookahead assertion

String[] array = str.split(",(?=R)");

答案 2 :(得分:1)

如果您正在创建自己的语言,最好将其视为一种语言并执行正确的lex / parse。有一些开源工具可以帮助解决这个问题,例如JFlex

但是,根据您当前的语言要求,您的结构非常简单,您可以按照其他答案中的建议轻松完成split()。随着您的语言随着时间的推移而演变,这可能会或可能不会继续存在。

答案 3 :(得分:0)

那里有很多脚本语言,你确定重新发明轮子是最好的利用你的时间吗?如果你是:

对于非平凡的语言,解析通常使用parser generator完成。

但是,对于简单的情况,手工编写并不太难。合理的方法是recursive decent parsing。在您的情况下,这看起来像:

import java.util.ArrayList;
import java.util.List;

abstract class Expression {

}

class MethodInvocation extends Expression {
    final String methodName;
    final List<Expression> arguments;

    MethodInvocation(String methodName, List<Expression> arguments) {
        this.methodName = methodName;
        this.arguments = arguments;
    }
}

class Literal extends Expression {
    final int value;

    Literal(int value) {
        this.value = value;
    }
}


public class Parser {
    char[] input;

    /** index of next character to consume */
    int index;

    Parser(String input) {
        this.input = input.toCharArray();
        index = 0;
    }

    void consumeExpected(char ch) {
        if (input[index] != ch) {
            throw new RuntimeException("Syntax Error");
        }
        index++;
    }

    String identifier() {
        int start = index;
        while (index < input.length && Character.isAlphabetic(input[index])) {
            index++;
        }
        return new String(input, start, index - start);
    }

    Literal numericLiteral() {
        int start = index;
        if (input[index] == '-') {
            index++;
        }
        while (index < input.length && '0' <= input[index] && input[index] <= '9') {
            index++;
        }
        return new Literal(Integer.parseInt(new String(input, start, index - start)));
    }

    Expression expression() {
        if (Character.isAlphabetic(input[index])) {
            String methodName = identifier();
            consumeExpected('(');

            List<Expression> arguments = new ArrayList<>();
            if (input[index] != ')') {
                do {
                    arguments.add(expression());
                } while (input[index++] == ',');
                index--;
                consumeExpected(')');
            }
            return new MethodInvocation(methodName, arguments);
        } else {
            return numericLiteral();
        }
    }

    public static void main(String[] args) {
        Expression ex = new Parser("R(rndInt(-10,10)),R(rndInt(-10,10))").expression();
        System.out.println(ex);
    }
}