< 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 >