1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 | package Torello.Java;
import Torello.Java.Function.IntTFunction;
class StrArrToReplFunc
{
static String replace(
final boolean ignoreCase,
final String s,
final String[] matchStrs,
final IntTFunction<String, String> replaceFunction
)
{
// Loop simply checks for null pointers.
for (int i=0; i < matchStrs.length; i++)
if (matchStrs[i] == null) throw new NullPointerException(
"The " + i + StrPrint.ordinalIndicator(i) + " of array parameter " +
"'matchStrs' is null."
);
// Use a StringBuilder to build the return String. It is precisely what it was
// it was designed for.
StringBuilder sb = new StringBuilder();
int last = 0;
// Main Loop: Builds a replacement StringBuilder. Looks for matches between the input
// String 's', and the matchStrs in array String[] matchStrs.
TOP:
for (int i=0; i < s.length(); i++)
for (int j=0; j < matchStrs.length; j++)
if (s.regionMatches(ignoreCase, i, matchStrs[j], 0, matchStrs[j].length()))
{
// A match was found, so begin
String nonMatchStr = s.substring(last, i);
String oldStr = s.substring(i, i + matchStrs[j].length());
String newStr = replaceFunction.apply(i, oldStr);
// Append them to the StringBuilder.
if (nonMatchStr.length() > 0) sb.append(nonMatchStr);
sb.append(newStr);
// Update the pointers
last = i + oldStr.length();
i = last - 1; // use -1 because of the loop-incrementer at top
continue TOP;
}
if (last == 0) return s; // There were no matches, return original String.
// This happens when there are remaining characters after the last match that occurred.
// Same as the HTML Parser - trailing READ/PARSE.
if (last < s.length()) sb.append(s.substring(last));
return sb.toString();
}
}
|