提交 59003066 编写于 作者: S sherman

7067045: replaceAll("\u20ac", "$"); causses java.lang.StringIndexOutOfBoundsExceptio

Summary: Updated to throw IAE instead.
Reviewed-by: lancea
上级 62ef905d
...@@ -759,16 +759,19 @@ public final class Matcher implements MatchResult { ...@@ -759,16 +759,19 @@ public final class Matcher implements MatchResult {
char nextChar = replacement.charAt(cursor); char nextChar = replacement.charAt(cursor);
if (nextChar == '\\') { if (nextChar == '\\') {
cursor++; cursor++;
if (cursor == replacement.length())
throw new IllegalArgumentException(
"character to be escaped is missing");
nextChar = replacement.charAt(cursor); nextChar = replacement.charAt(cursor);
result.append(nextChar); result.append(nextChar);
cursor++; cursor++;
} else if (nextChar == '$') { } else if (nextChar == '$') {
// Skip past $ // Skip past $
cursor++; cursor++;
// A StringIndexOutOfBoundsException is thrown if // Throw IAE if this "$" is the last character in replacement
// this "$" is the last character in replacement if (cursor == replacement.length())
// string in current implementation, a IAE might be throw new IllegalArgumentException(
// more appropriate. "Illegal group reference: group index is missing");
nextChar = replacement.charAt(cursor); nextChar = replacement.charAt(cursor);
int refNum = -1; int refNum = -1;
if (nextChar == '{') { if (nextChar == '{') {
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
* 5013885 5003322 4988891 5098443 5110268 6173522 4829857 5027748 6376940 * 5013885 5003322 4988891 5098443 5110268 6173522 4829857 5027748 6376940
* 6358731 6178785 6284152 6231989 6497148 6486934 6233084 6504326 6635133 * 6358731 6178785 6284152 6231989 6497148 6486934 6233084 6504326 6635133
* 6350801 6676425 6878475 6919132 6931676 6948903 6990617 7014645 7039066 * 6350801 6676425 6878475 6919132 6931676 6948903 6990617 7014645 7039066
* 7067045
*/ */
import java.util.regex.*; import java.util.regex.*;
...@@ -852,6 +853,17 @@ public class RegExTest { ...@@ -852,6 +853,17 @@ public class RegExTest {
if (!result.equals(toSupplementaries("zzz\\t$\\$zzz"))) if (!result.equals(toSupplementaries("zzz\\t$\\$zzz")))
failCount++; failCount++;
// IAE should be thrown if backslash or '$' is the last character
// in replacement string
try {
"\uac00".replaceAll("\uac00", "$");
"\uac00".replaceAll("\uac00", "\\");
failCount++;
} catch (IllegalArgumentException iie) {
} catch (Exception e) {
failCount++;
}
report("Literal replacement"); report("Literal replacement");
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册