我想用数组的值替换i#(看例子中的输入/输出),但是我不确定如何用Java + Regex做到这一点。

假设您有一个数组:[3,2,1,0]

输入示例:
i0
i1 ^ 2
(i1 + 2)+5
2 * 5 + i1
i1 + i2-i3
1 + 2

输出示例:
3 [为什么?输入为i0,数组中的索引0 = 3]
2 ^ 2
(2 + 2)+5
2 * 5 + 2
2 + 1-0
1 + 2

正则表达式在这里:
http://rubular.com/r/KXbCQnbs8K

regex = i {1}(\ d +)

码:

private String replace(String input){
    StringBuffer s = new StringBuffer();
    Pattern regex = Pattern.compile(REGEX);
    Matcher m = regex.matcher(input);

    if( !m.find(0) ){
        return input;
    }else{
        m.reset();
    }

    while (m.find() ){
        m.appendReplacement(s, getRealValue(m.group(1)) );
    }
    return s.toString();
}

private String getRealValue(String val){
    int value = Integer.parseInt(val);
    return String.valueOf(array.get(value));
}


假定给出的i#始终有效。我的代码在某些情况下有效,但大多数情况下都会失败。有什么帮助吗?谢谢!

编辑:
我不确定如何告诉它添加最后一部分(例如:i0 + 5中的+5)。

i0-工作
i1 ^ 2-不起作用
(i1 + 2)+5-不起作用
2 * 5 + i1-作品
i1 + i2-i3-不起作用
1 + 2-作品
1 + i2-工作

我想将正则表达式修改为“ i {1}(\ d +)(。*)”
if(lastMatch()){//如果最后一个匹配为true
s + = m.group(2)//连接最后一组(即“ i0 + 5”中的“ +5”)
}
但是我不知道正确的语法。

最佳答案

因此它失败了……关于正在产生的输出错误是什么?这是您忽略的非常有用的信息。将来,您应该尝试更多地思考输出错误的原因,这将帮助您确定程序在做什么错误。

但是从外观上看,您已经忘记了所有替换后使用的Matcher.appendTail(StringBuffer)appendTail在最后一个匹配项之后附加所有剩余字符,例如。 "i0[this bit]"

我认为输出错误


i1^2 -> 2
(i1+2)+5 -> (2


看着这个,找出问题所在会更快。忘记在末尾添加String的最后一位。让我们找到一种方法来解决这个问题,或者阅读API,看看是否有一种方法可以一步一步完成。

范例程式码

while (m.find() ){
    m.appendReplacement(s, getRealValue(m.group(1)) );
}
m.appendTail(s); // you missed out this line
return s.toString();

关于java - 用数组中的值替换较大字符串中所有出现的子字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8561097/

10-11 20:42