您好,这是我第一次在这里发帖,我确实环顾四周,找不到我遇到的问题的答案。
我需要将此字符串转换为两个字符串:
"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+")");
谢谢你们,我非常感谢你的帮助:)。
答案 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);
}
}