我想用数组的值替换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/