< prev index next >

src/java.base/share/classes/sun/util/locale/LocaleMatcher.java

Print this page

        

@@ -363,11 +363,11 @@
             // Special language range ("*") is ignored in lookup.
             if (range.equals("*")) {
                 continue;
             }
 
-            String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*");
+            String rangeForRegex = range.replace("*", "\\p{Alnum}*");
             while (rangeForRegex.length() > 0) {
                 for (String tag : tags) {
                     tag = tag.toLowerCase(Locale.ROOT);
                     if (tag.matches(rangeForRegex)
                             && !shouldIgnoreLookupMatch(zeroRanges, tag)) {

@@ -397,11 +397,11 @@
             // Special language range ("*") is ignored in lookup.
             if (range.equals("*")) {
                 continue;
             }
 
-            String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*");
+            String rangeForRegex = range.replace("*", "\\p{Alnum}*");
             while (rangeForRegex.length() > 0) {
                 if (tag.matches(rangeForRegex)) {
                     return true;
                 }
                 // Truncate from the end....

@@ -445,11 +445,11 @@
 
         return -1; // no q=0 range exists
     }
 
     public static List<LanguageRange> parse(String ranges) {
-        ranges = ranges.replaceAll(" ", "").toLowerCase(Locale.ROOT);
+        ranges = ranges.replace(" ", "").toLowerCase(Locale.ROOT);
         if (ranges.startsWith("accept-language:")) {
             ranges = ranges.substring(16); // delete unnecessary prefix
         }
 
         String[] langRanges = ranges.split(",");

@@ -534,25 +534,43 @@
         }
 
         return list;
     }
 
+    /**
+     * A faster alternative approach to String.replaceFirst(), if the given
+     * string is a literal String, not a regex.
+     */
+    private static String replaceFirstSubStringMatch(String range,
+            String substr, String replacement) {
+        int pos = range.indexOf(substr);
+        if (pos == -1) {
+            return range;
+        } else {
+            return range.substring(0, pos) + replacement
+                    + range.substring(pos + substr.length());
+        }
+    }
+
     private static String[] getEquivalentsForLanguage(String range) {
         String r = range;
 
         while (r.length() > 0) {
             if (LocaleEquivalentMaps.singleEquivMap.containsKey(r)) {
                 String equiv = LocaleEquivalentMaps.singleEquivMap.get(r);
                 // Return immediately for performance if the first matching
                 // subtag is found.
-                return new String[] {range.replaceFirst(r, equiv)};
+                return new String[]{replaceFirstSubStringMatch(range,
+                    r, equiv)};
             } else if (LocaleEquivalentMaps.multiEquivsMap.containsKey(r)) {
                 String[] equivs = LocaleEquivalentMaps.multiEquivsMap.get(r);
+                String[] result = new String[equivs.length];
                 for (int i = 0; i < equivs.length; i++) {
-                    equivs[i] = range.replaceFirst(r, equivs[i]);
+                    result[i] = replaceFirstSubStringMatch(range,
+                            r, equivs[i]);
                 }
-                return equivs;
+                return result;
             }
 
             // Truncate the last subtag simply.
             int index = r.lastIndexOf('-');
             if (index == -1) {

@@ -576,11 +594,13 @@
                     continue;
                 }
 
                 int len = index + subtag.length();
                 if (range.length() == len || range.charAt(len) == '-') {
-                    return range.replaceFirst(subtag, LocaleEquivalentMaps.regionVariantEquivMap.get(subtag));
+                    return replaceFirstSubStringMatch(range, subtag,
+                            LocaleEquivalentMaps.regionVariantEquivMap
+                                    .get(subtag));
                 }
             }
         }
 
         return null;
< prev index next >