diff options
author | Andrew John Hughes <gandalf@gcc.gnu.org> | 2012-03-23 15:19:26 +0000 |
---|---|---|
committer | Andrew John Hughes <gandalf@gcc.gnu.org> | 2012-03-23 15:19:26 +0000 |
commit | 0563022a206294757effa44686727bffc4f7c2bd (patch) | |
tree | febe3d4d4c0c994db223fee8e819bde6582494c9 /libjava/classpath/java/util/regex | |
parent | 21669dfe20db0246ece395db5558a081a5c7088f (diff) | |
download | gcc-0563022a206294757effa44686727bffc4f7c2bd.zip gcc-0563022a206294757effa44686727bffc4f7c2bd.tar.gz gcc-0563022a206294757effa44686727bffc4f7c2bd.tar.bz2 |
Merge GNU Classpath 0.99 into libjava.
From-SVN: r185741
Diffstat (limited to 'libjava/classpath/java/util/regex')
-rw-r--r-- | libjava/classpath/java/util/regex/Matcher.java | 29 | ||||
-rw-r--r-- | libjava/classpath/java/util/regex/Pattern.java | 40 |
2 files changed, 68 insertions, 1 deletions
diff --git a/libjava/classpath/java/util/regex/Matcher.java b/libjava/classpath/java/util/regex/Matcher.java index be57471..8d033d5 100644 --- a/libjava/classpath/java/util/regex/Matcher.java +++ b/libjava/classpath/java/util/regex/Matcher.java @@ -169,6 +169,12 @@ public final class Matcher implements MatchResult if (match != null) { int endIndex = match.getEndIndex(); + // Is the match within input limits? + if (endIndex > input.length()) + { + match = null; + return false; + } // Are we stuck at the same position? if (!first && endIndex == position) { @@ -608,4 +614,27 @@ public final class Matcher implements MatchResult return snapshot; } + /** + * Returns a literalized string of s where characters {@code $} and {@code + * \\} are escaped. + * + * @param s the string to literalize. + * @return the literalized string. + * @since 1.5 + */ + public static String quoteReplacement(String s) + { + if (s == null) + throw new NullPointerException(); + CPStringBuilder sb = new CPStringBuilder(); + for (int i = 0; i < s.length(); i++) + { + char ch = s.charAt(i); + if (ch == '$' || ch == '\\') + sb.append('\\'); + sb.append(ch); + } + return sb.toString(); + } + } diff --git a/libjava/classpath/java/util/regex/Pattern.java b/libjava/classpath/java/util/regex/Pattern.java index 7d1fc84..b1c937f 100644 --- a/libjava/classpath/java/util/regex/Pattern.java +++ b/libjava/classpath/java/util/regex/Pattern.java @@ -1,5 +1,6 @@ /* Pattern.java -- Compiled regular expression ready to be applied. - Copyright (C) 2002, 2004, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 2002, 2004, 2005, 2007, 2010 + Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -37,6 +38,8 @@ exception statement from your version. */ package java.util.regex; +import gnu.java.lang.CPStringBuilder; + import gnu.java.util.regex.RE; import gnu.java.util.regex.REException; import gnu.java.util.regex.RESyntax; @@ -260,6 +263,41 @@ public final class Pattern implements Serializable } /** + * Returns a literal pattern for the specified String. + * + * @param String to return a literal pattern for. + * @return a literal pattern for the specified String. + * @exception NullPointerException if str is null. + * @since 1.5 + */ + public static String quote(String str) + { + int eInd = str.indexOf("\\E"); + if (eInd < 0) + { + // No need to handle backslashes. + return "\\Q" + str + "\\E"; + } + + CPStringBuilder sb = new CPStringBuilder(str.length() + 16); + sb.append("\\Q"); // start quote + + int pos = 0; + do + { + // A backslash is quoted by another backslash; + // 'E' is not needed to be quoted. + sb.append(str.substring(pos, eInd)) + .append("\\E" + "\\\\" + "E" + "\\Q"); + pos = eInd + 2; + } while ((eInd = str.indexOf("\\E", pos)) >= 0); + + sb.append(str.substring(pos, str.length())) + .append("\\E"); // end quote + return sb.toString(); + } + + /** * Return the regular expression used to construct this object. * @specnote Prior to JDK 1.5 this method had a different behavior * @since 1.5 |