我试图使用下面的代码将pi替换为*pi,但是它会引发完全出乎意料的异常。匹配者如何看待比字符串长度更高的索引?
private void makeEvaluationStringExpressionMXParserCompliant() {
Pattern multiply = Pattern.compile(mContext.getString(R.string.string_multiply));
Pattern pi = Pattern.compile(mContext.getString(R.string.string_pie));
Pattern e = Pattern.compile(mContext.getString(R.string.string_e));
Log.e("wingoku", "pi: "+ pi.toString() + " completeString: "+ mEvaluationStringExpressionBuilder.toString());
replaceAll(mEvaluationStringExpressionBuilder, pi, "*pi");
}
private void replaceAll(StringBuilder sb, Pattern pattern, String replacement) {
Matcher m = pattern.matcher(sb);
int start = 0;
while (m.find(start)) {
sb.replace(m.start(), m.end(), replacement);
start = m.start() + replacement.length();
}
}例外:
java.lang.IndexOutOfBoundsException: start=3; length=2
at java.util.regex.Matcher.find(Matcher.java:339)
at com.app.calculator.utils.StringExpressionFactory.replaceAll(StringExpressionFactory.java:68)
at com.app.calculator.utils.StringExpressionFactory.makeEvaluationStringExpressionMXParserCompliant(StringExpressionFactory.java:61)
at com.app.calculator.utils.StringExpressionFactory.createExpression(StringExpressionFactory.java:31)发布于 2017-03-25 23:53:33
问题是,您正在传递一个初始索引,该索引超出了要在其中查找匹配字符串的长度。方法文档说明如下:
抛出:
IndexOutOfBoundsException-如果开始小于零,或者如果开始大于输入序列的长度。
您需要添加一个检查,以查看初始索引是否有效:
while (start < sb.length() && m.find(start)) {
sb.replace(m.start(), m.end(), replacement);
start = m.start() + replacement.length();
}发布于 2017-03-26 00:07:03
你在开始位置上有个错误。你可以检查一下。以下源代码:
public static void replaceAll(StringBuilder sb, Pattern pattern, String replacement) {
Matcher m = pattern.matcher(sb);
while(m.find()) {
sb.replace(m.start(), m.end(), replacement);
}}
你最好写个代码。您不需要使replaceAll函数
StrBuilder replaceAll(char search, char replace) 将搜索字符替换为整个生成器中的替换字符。
https://stackoverflow.com/questions/43023255
复制相似问题