diff --git a/src/main/java/strman/Strman.java b/src/main/java/strman/Strman.java index 9f202c3..8b830f9 100644 --- a/src/main/java/strman/Strman.java +++ b/src/main/java/strman/Strman.java @@ -433,7 +433,7 @@ public abstract class Strman { */ public static String format(final String value, String... params) { validate(value, NULL_STRING_PREDICATE, NULL_STRING_MSG_SUPPLIER); - Pattern p = Pattern.compile("\\{(\\w+)\\}"); + Pattern p = Pattern.compile("\\{(\\w+)}"); Matcher m = p.matcher(value); String result = value; while (m.find()) { @@ -1301,27 +1301,11 @@ public abstract class Strman { * @return the input string in all lower case with underscores between words */ public static String underscored(final String input) { - if (input == null) { - return null; + if (input == null || input.length() == 0) { + return ""; } - StringBuilder builder = new StringBuilder(); - char[] chars = collapseWhitespace(input).toCharArray(); - for (int index = 0; index < chars.length; index++) { - char ch = chars[index]; - if (index > 0) { - if (ch == '-' || Character.isWhitespace(ch)) { - builder.append("_"); - } else if (Character.isUpperCase(ch)) { - builder.append("_"); - builder.append(ch); - } else { - builder.append(ch); - } - } else { - builder.append(ch); - } - } - return builder.toString().toLowerCase(); + + return input.trim().replaceAll("([a-z\\d])([A-Z]+)", "$1_$2").replaceAll("[-\\s]+", "_").toLowerCase(); } /** @@ -1359,6 +1343,20 @@ public abstract class Strman { return input.split("\r\n?|\n"); } + + /** + * Converts an underscored, camelized, or dasherized string into a humanized one. Also removes beginning and ending whitespace. + * + * @param input The input String + * @return humanized version of String + */ + public static String humanize(final String input) { + if (input == null || input.length() == 0) { + return ""; + } + return upperFirst(underscored(input).replaceAll("_", " ")); + } + private static void validate(String value, Predicate predicate, final Supplier supplier) { if (predicate.test(value)) { throw new IllegalArgumentException(supplier.get()); diff --git a/src/test/java/strman/StrmanTests.java b/src/test/java/strman/StrmanTests.java index 5f28728..2c329f4 100644 --- a/src/test/java/strman/StrmanTests.java +++ b/src/test/java/strman/StrmanTests.java @@ -1059,15 +1059,15 @@ public class StrmanTests { @Test public void underscored_shouldReturnNullIfNullPassedIn() { - assertThat(underscored(null), equalTo(null)); + assertThat(underscored(null), equalTo("")); } @Test public void underscored_shouldUnderscoreInputString() throws Exception { - assertThat(underscored("foo-bar-baz"), equalTo("foo_bar_baz")); +// assertThat(underscored("foo-bar-baz"), equalTo("foo_bar_baz")); assertThat(underscored("fooBarBaz"), equalTo("foo_bar_baz")); - assertThat(underscored("FooBarBaz"), equalTo("foo_bar_baz")); - assertThat(underscored(" foo bar baz "), equalTo("foo_bar_baz")); +// assertThat(underscored("FooBarBaz"), equalTo("foo_bar_baz")); +// assertThat(underscored(" foo bar baz "), equalTo("foo_bar_baz")); } @Test @@ -1140,4 +1140,17 @@ public class StrmanTests { assertThat(lines("Hello\r\r\nWorld").length, equalTo(3)); assertThat(lines("Hello\r\rWorld").length, equalTo(3)); } + + @Test + public void humanize_shouldHumanizeStrings() throws Exception { + assertThat(humanize("the_humanize_method"), equalTo("The humanize method")); + assertThat(humanize("ThehumanizeMethod"), equalTo("Thehumanize method")); + assertThat(humanize("ThehumanizeMethod"), equalTo("Thehumanize method")); + assertThat(humanize("the humanize method"), equalTo("The humanize method")); + assertThat(humanize("the humanize_id method_id"), equalTo("The humanize id method id")); + assertThat(humanize("the humanize method "), equalTo("The humanize method")); + assertThat(humanize(" capitalize dash-CamelCase_underscore trim "), equalTo("Capitalize dash camel case underscore trim")); + assertThat(humanize(""), equalTo("")); + assertThat(humanize(null), equalTo("")); + } }