aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath/java/util/regex
diff options
context:
space:
mode:
authorAndrew John Hughes <gandalf@gcc.gnu.org>2012-03-23 15:19:26 +0000
committerAndrew John Hughes <gandalf@gcc.gnu.org>2012-03-23 15:19:26 +0000
commit0563022a206294757effa44686727bffc4f7c2bd (patch)
treefebe3d4d4c0c994db223fee8e819bde6582494c9 /libjava/classpath/java/util/regex
parent21669dfe20db0246ece395db5558a081a5c7088f (diff)
downloadgcc-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.java29
-rw-r--r--libjava/classpath/java/util/regex/Pattern.java40
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