>From 674bac6bc573322c0003f7947ff9446efbc1d349 Mon Sep 17 00:00:00 2001
From: Ivan Maidanski <iv...@mail.ru>
Date: Sat, 22 Jan 2011 21:36:13 +0200
Subject: [PATCH] Implement Pattern.quote() API method

2010-07-02  Ivan Maidanski  <iv...@mail.ru>

        * java/util/regex/Pattern.java:
        (quote): Implement new 1.5 Java API method.
---
 ChangeLog                    |    5 +++++
 java/util/regex/Pattern.java |   39 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 43 insertions(+), 1 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4d0bf6d..52b4760 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-02  Ivan Maidanski  <iv...@mail.ru>
+
+       * java/util/regex/Pattern.java:
+       (quote): Implement new 1.5 Java API method.
+
 2011-01-21  Pekka Enberg <penb...@kernel.org>
 
        * java/lang/Class.java:
diff --git a/java/util/regex/Pattern.java b/java/util/regex/Pattern.java
index 7d1fc84..4b306a0 100644
--- a/java/util/regex/Pattern.java
+++ b/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,40 @@ public final class Pattern implements Serializable
   }
 
   /**
+   * Returns a literal pattern for the specified String.
+   * @param String to return a literal pattern for.
+   * @exception NullPointerException if str is null.
+   * @returns a literal pattern for the specified String.
+   * @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
-- 
1.7.1




Reply via email to