Skip to content

Commit 562ff92

Browse files
committed
introduce replaceChars(String, String, String)
1 parent a4c7ea7 commit 562ff92

2 files changed

Lines changed: 79 additions & 0 deletions

File tree

src/main/java/org/htmlunit/util/StringUtils.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,60 @@ public static boolean containsIgnoreCase(final String s, final String expected)
232232
return false;
233233
}
234234

235+
/**
236+
* Replaces multiple characters in a String in one go.
237+
* This method can also be used to delete characters.
238+
*
239+
* @param str String to replace characters in, may be null.
240+
* @param searchChars a set of characters to search for, may be null.
241+
* @param replaceChars a set of characters to replace, may be null.
242+
* @return modified String, or the input string if no replace was done.
243+
*/
244+
public static String replaceChars(final String str, final String searchChars, String replaceChars) {
245+
if (isEmptyOrNull(str) || isEmptyOrNull(searchChars)) {
246+
return str;
247+
}
248+
249+
replaceChars = replaceChars == null ? "" : replaceChars;
250+
final int replaceCharsLength = replaceChars.length();
251+
final int strLength = str.length();
252+
253+
StringBuilder buf = null;
254+
int i = 0;
255+
for ( ; i < strLength; i++) {
256+
final char ch = str.charAt(i);
257+
final int index = searchChars.indexOf(ch);
258+
if (index >= 0) {
259+
buf = new StringBuilder(strLength);
260+
buf.append(str, 0, i);
261+
if (index < replaceCharsLength) {
262+
buf.append(replaceChars.charAt(index));
263+
}
264+
break;
265+
}
266+
}
267+
268+
if (buf == null) {
269+
return str;
270+
}
271+
272+
i++;
273+
for ( ; i < strLength; i++) {
274+
final char ch = str.charAt(i);
275+
final int index = searchChars.indexOf(ch);
276+
if (index >= 0) {
277+
if (index < replaceCharsLength) {
278+
buf.append(replaceChars.charAt(index));
279+
}
280+
}
281+
else {
282+
buf.append(ch);
283+
}
284+
}
285+
286+
return buf.toString();
287+
}
288+
235289
/**
236290
* Escapes the characters '&lt;', '&gt;' and '&amp;' into their XML entity equivalents.
237291
*

src/test/java/org/htmlunit/util/StringUtilsTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,31 @@ public void stringToByteArray() throws Exception {
334334
assertEquals(104, result[0]);
335335
}
336336

337+
/**
338+
* Test for method {@link StringUtils#replaceChars(String, String, String)}.
339+
*/
340+
@Test
341+
public void replaceChars() {
342+
assertEquals(null, StringUtils.replaceChars(null, "", ""));
343+
assertEquals("", StringUtils.replaceChars("", "", null));
344+
assertEquals("abc", StringUtils.replaceChars("abc", null, null));
345+
assertEquals("abc", StringUtils.replaceChars("abc", "", ""));
346+
assertEquals("ac", StringUtils.replaceChars("abc", "b", null));
347+
assertEquals("ac", StringUtils.replaceChars("abc", "b", ""));
348+
assertEquals("ayzya", StringUtils.replaceChars("abcba", "bc", "yz"));
349+
assertEquals("ayya", StringUtils.replaceChars("abcba", "bc", "y"));
350+
assertEquals("ayzya", StringUtils.replaceChars("abcba", "bc", "yzx"));
351+
352+
assertEquals("abc", StringUtils.replaceChars("abc", "d", "e"));
353+
354+
assertEquals("ebc", StringUtils.replaceChars("abc", "a", "e"));
355+
assertEquals("bc", StringUtils.replaceChars("abc", "a", ""));
356+
357+
assertEquals("abe", StringUtils.replaceChars("abc", "c", "e"));
358+
assertEquals("ab", StringUtils.replaceChars("abc", "c", null));
359+
}
360+
361+
337362
/**
338363
* @throws Exception if the test fails
339364
*/

0 commit comments

Comments
 (0)