Hello, I wrote a personal class "StringHelper" using the StringUtils class and containing some classic routines. I think those could be added to the StringUtils class.
There are some of these methods (JavaDoc is actually in French, so I didn't include it here) : -------------------------------------------------------------------------------- /** * StringHelper.abbreviate(null, *, *, *) = null * StringHelper.abbreviate("", 10, 2, 3) = "" * StringHelper.abbreviate("0123456789ABCDEF", 16, 3, 2) = "0123456789ABCDEF" * StringHelper.abbreviate("0123456789ABCDEF", 10, 3, 2) = "01234...EF" * StringHelper.abbreviate("Lorem ipsum dolor sit amet", 23, 6, 5) = "Lorem ipsum dol... amet" * StringHelper.abbreviate("012345", 5, 0, 2) => {@link IllegalArgumentException} */ public static String abbreviate(String pString, int pMaxLength, int pPrefixLength, int pSuffixLength); /** * StringHelper.abbreviate(null, null, null, *) = null * StringHelper.abbreviate("", null, null, *) = "" * StringHelper.abbreviate(null, "", null, *) = "" * StringHelper.abbreviate(null, null, "", *) = "" * StringHelper.abbreviate("", "", "", 10) = "" * StringHelper.abbreviate("a", "b", "c", 10) = "abc" * StringHelper.abbreviate("012", "3456789ABCD", "EF", 16) = "0123456789ABCDEF" * StringHelper.abbreviate("012", "3456789ABCD", "EF", 10) = "01234...EF" * StringHelper.abbreviate("Lorem ", "ipsum dolor sit", " amet", 23) = "Lorem ipsum dol... amet" * StringHelper.abbreviate("", "0123", "45", 5) => {@link IllegalArgumentException} */ public static String abbreviate(String pPrefix, String pString, String pSuffix, int pMaxLength); /** * StringHelper.leftPadLeftCut(null, *, *, false) = null * StringHelper.leftPadLeftCut(null, 3, 'z', true) = "zzz" * StringHelper.leftPadLeftCut("", 3, 'z', *) = "zzz" * StringHelper.leftPadLeftCut("bat", 3, 'z', *) = "bat" * StringHelper.leftPadLeftCut("bat", 5, 'z', *) = "zzbat" * StringHelper.leftPadLeftCut("bat", 1, 'z', *) = "t" * StringHelper.leftPadLeftCut("bat", -1, 'z', *) = "" */ public static String leftPadLeftCut(String pString, int pFixedSize, char pPadChar, boolean pNullAsEmpty); /** * StringHelper.leftPadRightCut(null, *, *, false) = null * StringHelper.leftPadRightCut(null, 3, 'z', true) = "zzz" * StringHelper.leftPadRightCut("", 3, 'z', *) = "zzz" * StringHelper.leftPadRightCut("bat", 3, 'z', *) = "bat" * StringHelper.leftPadRightCut("bat", 5, 'z', *) = "zzbat" * StringHelper.leftPadRightCut("bat", 1, 'z', *) = "b" * StringHelper.leftPadRightCut("bat", -1, 'z', *) = "" */ public static String leftPadRightCut(String pString, int pFixedSize, char pPadChar, boolean pNullAsEmpty); /** * StringHelper.rightPadRightCut(null, *, *, false) = null * StringHelper.rightPadRightCut(null, 3, 'z', true) = "zzz" * StringHelper.rightPadRightCut("", 3, 'z', *) = "zzz" * StringHelper.rightPadRightCut("bat", 3, 'z', *) = "bat" * StringHelper.rightPadRightCut("bat", 5, 'z', *) = "batzz" * StringHelper.rightPadRightCut("bat", 1, 'z', *) = "b" * StringHelper.rightPadRightCut("bat", -1, 'z', *) = "" */ public static String rightPadRightCut(String pString, int pFixedSize, char pPadChar, boolean pNullAsEmpty); /** * StringHelper.rightPadLeftCut(null, *, *, false) = null * StringHelper.rightPadLeftCut(null, 3, 'z', true) = "zzz" * StringHelper.rightPadLeftCut("", 3, 'z', *) = "zzz" * StringHelper.rightPadLeftCut("bat", 3, 'z', *) = "bat" * StringHelper.rightPadLeftCut("bat", 5, 'z', *) = "batzz" * StringHelper.rightPadLeftCut("bat", 1, 'z', *) = "t" * StringHelper.rightPadLeftCut("bat", -1, 'z', *) = "" */ public static String rightPadLeftCut(String pString, int pFixedSize, char pPadChar, boolean pNullAsEmpty); /** * StringHelper.rotate(null, *) = null * StringHelper.rotate("", *) = "" * StringHelper.rotate("ABCDEFG", 0) = "ABCDEF" * StringHelper.rotate("ABCDEFG", 2) = "FGABCDE" * StringHelper.rotate("ABCDEFG", -2) = "CDEFGAB" * StringHelper.rotate("ABCDEFG", 7) = "ABCDEFG" * StringHelper.rotate("ABCDEFG", -7) = "ABCDEFG" * StringHelper.rotate("ABCDEFG", 9) = "FGABCDE" * StringHelper.rotate("ABCDEFG", -9) = "CDEFGAB" */ public static String rotate(String pString, int pCount); /** * StringHelper.replaceAll(null, *, *) = null * StringHelper.replaceAll(*, null, *) => {@link NullPointerException} * StringHelper.replaceAll(*, *, null) => {@link NullPointerException} * StringHelper.replaceAll("", "", "abc") = "abc" * StringHelper.replaceAll("", ".*", "abc") = "abc" * StringHelper.replaceAll("", ".+", "abc") = "" * StringHelper.replaceAll("ABCabc123", "[a-z]", "_") = "ABC___123" * StringHelper.replaceAll("ABCabc123", "[^A-Z0-9]+", "_") = "ABC_123" * StringHelper.replaceAll("ABCabc123", "[^A-Z0-9]+", "") = "ABC123" * StringHelper.replaceAll("Lorem ipsum dolor sit", "( +)([a-z]+)", "_$2") = "Lorem_ipsum_dolor_sit" * * @see String#replaceAll(String, String) * @see java.util.regex.Pattern */ public static String replaceAll(String pString, String pRegex, String pReplacement); /** * StringHelper.replaceFirst(null, *, *) = null * StringHelper.replaceFirst(*, null, *) => {@link NullPointerException} * StringHelper.replaceFirst(*, *, null) => {@link NullPointerException} * StringHelper.replaceFirst("", "", "abc") = "abc" * StringHelper.replaceFirst("", ".*", "abc") = "abc" * StringHelper.replaceFirst("", ".+", "abc") = "" * StringHelper.replaceFirst("ABCabc123", "[a-z]", "_") = "ABC_bc123" * StringHelper.replaceFirst("ABCabc123abc", "[^A-Z0-9]+", "_") = "ABC_123abc" * StringHelper.replaceFirst("ABCabc123abc", "[^A-Z0-9]+", "") = "ABC123abc" * StringHelper.replaceFirst("Lorem ipsum dolor sit", "( +)([a-z]+)", "_$2") = "Lorem_ipsum dolor sit" * * @see String#replaceFirst(String, String) * @see java.util.regex.Pattern */ public static String replaceFirst(String pString, String pRegex, String pReplacement); public static int compare(String pString1, String pString2); public static int compareIgnoreCase(String pString1, String pString2); /** * @param pAlgorithm : MD5, SHA-1,... see {@link MessageDigest} * @throws NoSuchAlgorithmException - */ public static String hash(String pString, String pAlgorithm) throws NoSuchAlgorithmException; public static byte[] hashBytes(String pString, String pAlgorithm) throws NoSuchAlgorithmException; /** * Convert a bytes array to an hexadecimal String represetation (big endian) */ public static String toHexString(byte[] pBytes); /** * @return Integer or {@code null} if pString is empty */ public static Integer toIntegerEmpty(String pString); /** * StringHelper.splitByLength(null, *) = null * StringHelper.splitByLength("abc") = [] * StringHelper.splitByLength("", 2, 4, 1) = [null, null, null] * StringHelper.splitByLength("abcdefg", 2, 4, 1) = ["ab", "cdef", "g"] * StringHelper.splitByLength("abcdefghij", 2, 4, 1) = ["ab", "cdef", "g"] * StringHelper.splitByLength("abcdef", 2, 4, 1) = ["ab", "cdef", null] * StringHelper.splitByLength("abcdef ", 2, 4, 1) = ["ab", "cdef", " "] * StringHelper.splitByLength(" abcdefg", 2, 4, 1) = [" a", "bcde", "f"] * StringHelper.splitByLength("abcdefg", 2, 4, 0, 1) = ["ab", "cdef", null, "g"] * * @return String[] or {@code null} if <code>pString == null</code> */ public static String[] splitByLength(String pString, int ... pColLengths); /** * Return {@link Matcher} from <code>pRegex.matcher(pString)</code> * @return {@link Matcher} ou <code>null</code> */ public static Matcher matcher(CharSequence pString, Pattern pRegex); /** * Return {@link Matcher} from <code>Pattern.compile(pRegex).matcher(pString)</code> * @return {@link Matcher} ou <code>null</code> */ public static Matcher matcher(CharSequence pString, String pRegex); public static boolean matches(CharSequence pString, Pattern pRegex); public static boolean matches(CharSequence pString, String pRegex); -------------------------------------------------------------------------------- I will rename parameters and add final qualifier to respect your coding practices. I will translate the JavaDoc and comments in English. If you are interested, I can add those to StringUtils (and associated test cases) in my github repository. It's my first contribution, so how would you like it to be done ? 1- make a JIRA ticket by logical group of methods and related git pull request 2- make a single detailed JIRA ticket with all methods and a single git pull request with one commit by logical group of methods Best regards, -- Loic Guibert --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org