What is the simplest way to convert a Java string from all caps (words separated by underscores) to CamelCase (no word separators)?

JavaRegexString

Java Problem Overview


The title pretty much says it all. What's the simplest/most elegant way that I can convert, in Java, a string from the format "THIS_IS_AN_EXAMPLE_STRING" to the format "ThisIsAnExampleString"? I figure there must be at least one way to do it using String.replaceAll() and a regex.

My initial thoughts are: prepend the string with an underscore (_), convert the whole string to lower case, and then use replaceAll to convert every character preceded by an underscore with its uppercase version.

Java Solutions


Solution 1 - Java

Another option is using Google Guava's com.google.common.base.CaseFormat

George Hawkins left a comment with this example of usage:

CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "THIS_IS_AN_EXAMPLE_STRING");

Solution 2 - Java

Take a look at WordUtils in the Apache Commons lang library:

Specifically, the capitalizeFully(String str, char[] delimiters) method should do the job:

String blah = "LORD_OF_THE_RINGS";
assertEquals("LordOfTheRings", WordUtils.capitalizeFully(blah, '_').replaceAll("_", ""));

Green bar!

Solution 3 - Java

static String toCamelCase(String s){
   String[] parts = s.split("_");
   String camelCaseString = "";
   for (String part : parts){
      camelCaseString = camelCaseString + toProperCase(part);
   }
   return camelCaseString;
}

static String toProperCase(String s) {
    return s.substring(0, 1).toUpperCase() +
               s.substring(1).toLowerCase();
}

Note: You need to add argument validation.

Solution 4 - Java

With Apache Commons Lang3 lib is it very easy.

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.text.WordUtils;

public String getName(String text) {
  return StringUtils.remove(WordUtils.capitalizeFully(text, '_'), "_");
}

Example:

getName("SOME_CONSTANT");

Gives:

"SomeConstant"

Solution 5 - Java

Here is a code snippet which might help:

String input = "ABC_DEF";
StringBuilder sb = new StringBuilder();
for( String oneString : input.toLowerCase().split("_") )
{
    sb.append( oneString.substring(0,1).toUpperCase() );
    sb.append( oneString.substring(1) );
}

// sb now holds your desired String

Solution 6 - Java

Java 1.8 example using Streams

String text = "THIS_IS_SOME_TEXT";

String bactrianCamel = Stream.of(text.split("[^a-zA-Z0-9]"))
        .map(v -> v.substring(0, 1).toUpperCase() + v.substring(1).toLowerCase())
        .collect(Collectors.joining());
String dromedaryCamel = bactrianCamel.toLowerCase().substring(0, 1) + bactrianCamel.substring(1); 

System.out.printf("%s is now %s%n", text, dromedaryCamel); 

THIS_IS_SOME_TEXT is now thisIsSomeText

Solution 7 - Java

public static void main(String[] args) {
    String start = "THIS_IS_A_TEST";
    StringBuffer sb = new StringBuffer();
    for (String s : start.split("_")) {
        sb.append(Character.toUpperCase(s.charAt(0)));
        if (s.length() > 1) {
            sb.append(s.substring(1, s.length()).toLowerCase());
        }
    }
    System.out.println(sb);
}

Solution 8 - Java

The Apache Commons project does now have the CaseUtils class, which has a toCamelCase method that does exactly as OP asked:

 CaseUtils.toCamelCase("THIS_IS_AN_EXAMPLE_STRING", true, '_');

Solution 9 - Java

You can use org.modeshape.common.text.Inflector.

Specifically:

> String camelCase(String lowerCaseAndUnderscoredWord, > boolean uppercaseFirstLetter, char... delimiterChars) > > By default, this method converts strings to UpperCamelCase.

Maven artifact is: org.modeshape:modeshape-common:2.3.0.Final

on JBoss repository: https://repository.jboss.org/nexus/content/repositories/releases

Here's the JAR file: https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar

Solution 10 - Java

Not sure, but I think I can use less memory and get dependable performance by doing it char-by-char. I was doing something similar, but in loops in background threads, so I am trying this for now. I've had some experience with String.split being more expensive then expected. And I am working on Android and expect GC hiccups to be more of an issue then cpu use.

  public static String toCamelCase(String value) {
    StringBuilder sb = new StringBuilder();
    
    final char delimChar = '_';
    boolean lower = false;
    for (int charInd = 0; charInd < value.length(); ++charInd) {
      final char valueChar = value.charAt(charInd);
      if (valueChar == delimChar) {
        lower = false;
      } else if (lower) {
        sb.append(Character.toLowerCase(valueChar));
      } else {
        sb.append(Character.toUpperCase(valueChar));
        lower = true;
      }
    }

    return sb.toString();
  }

A hint that String.split is expensive is that its input is a regex (not a char like String.indexOf) and it returns an array (instead of say an iterator because the loop only uses one things at a time). Plus cases like "AB_AB_AB_AB_AB_AB..." break the efficiency of any bulk copy, and for long strings use an order of magnitude more memory then the input string.

Whereas looping through chars has no canonical case. So to me the overhead of an unneeded regex and array seems generally less preferable (then giving up possible bulk copy efficiency). Interested to hear opinions / corrections, thanks.

Solution 11 - Java

public String withChars(String inputa) {
    String input = inputa.toLowerCase();
    StringBuilder sb = new StringBuilder();
    final char delim = '_';
    char value;
    boolean capitalize = false;
    for (int i=0; i<input.length(); ++i) {
        value = input.charAt(i);
        if (value == delim) {
            capitalize = true;
        }
        else if (capitalize) {
            sb.append(Character.toUpperCase(value));
            capitalize = false;
        }
        else {
            sb.append(value);
        }
    }

    return sb.toString();
}

public String withRegex(String inputa) {
    String input = inputa.toLowerCase();
    String[] parts = input.split("_");
    StringBuilder sb = new StringBuilder();
    sb.append(parts[0]);
    for (int i=1; i<parts.length; ++i) {
        sb.append(parts[i].substring(0,1).toUpperCase());
        sb.append(parts[i].substring(1));
    }

    return sb.toString();
}

Times: in milli seconds.

Iterations = 1000
WithChars: start = 1379685214671 end = 1379685214683 diff = 12
WithRegex: start = 1379685214683 end = 1379685214712 diff = 29

Iterations = 1000
WithChars: start = 1379685217033 end = 1379685217045 diff = 12
WithRegex: start = 1379685217045 end = 1379685217077 diff = 32

Iterations = 1000
WithChars: start = 1379685218643 end = 1379685218654 diff = 11
WithRegex: start = 1379685218655 end = 1379685218684 diff = 29

Iterations = 1000000
WithChars: start = 1379685232767 end = 1379685232968 diff = 201
WithRegex: start = 1379685232968 end = 1379685233649 diff = 681

Iterations = 1000000
WithChars: start = 1379685237220 end = 1379685237419 diff = 199
WithRegex: start = 1379685237419 end = 1379685238088 diff = 669

Iterations = 1000000
WithChars: start = 1379685239690 end = 1379685239889 diff = 199
WithRegex: start = 1379685239890 end = 1379685240585 diff = 695

Iterations = 1000000000
WithChars: start = 1379685267523 end = 1379685397604 diff = 130081
WithRegex: start = 1379685397605 end = 1379685850582 diff = 452977

Solution 12 - Java

You can Try this also :

 public static String convertToNameCase(String s)
    {
        if (s != null)
        {
            StringBuilder b = new StringBuilder();
            String[] split = s.split(" ");
            for (String srt : split)
            {
                if (srt.length() > 0)
                {
                    b.append(srt.substring(0, 1).toUpperCase()).append(srt.substring(1).toLowerCase()).append(" ");
                }
            }
            return b.toString().trim();
        }
        return s;
    }

Solution 13 - Java

protected String toCamelCase(String input) {
	if (input == null) {
		return null;
	}

	if (input.length() == 0) {
		return "";
	}

	// lowercase the first character
	String camelCaseStr = input.substring(0, 1).toLowerCase();

	if (input.length() > 1) {
		boolean isStartOfWord = false;

		for (int i = 1; i < input.length(); i++) {
			char currChar = input.charAt(i);
			if (currChar == '_') {
				// new word. ignore underscore
				isStartOfWord = true;
			} else if (Character.isUpperCase(currChar)) {
				// capital letter. if start of word, keep it
				if (isStartOfWord) {
					camelCaseStr += currChar;
				} else {
					camelCaseStr += Character.toLowerCase(currChar);
				}
				isStartOfWord = false;
			} else {
				camelCaseStr += currChar;
				isStartOfWord = false;
			}
		}
	}

	return camelCaseStr;
}

Solution 14 - Java

public String CamelCase(String str)
{
	String CamelCase="";
	String parts[] = str.split("_");
	for(String part:parts)
	{
		String as=part.toLowerCase();
		int a=as.length();
		CamelCase = CamelCase + as.substring(0, 1).toUpperCase()+ as.substring(1,a);	
	}
	return CamelCase;
}

This is the Simplest Program to convert into CamelCase. hope it Will Help You..

Solution 15 - Java

public static String toCamelCase(String value) {
    value = value.replace("_", " ");
    String[] parts = value.split(" ");
    int i = 0;
    String camelCaseString = "";
    for (String part : parts) {
        if (part != null && !part.isEmpty()) {
            if (i == 0) {
                camelCaseString = part.toLowerCase();
            } else if (i > 0 && part.length() > 1) {
                String oldFirstChar = part.substring(0, 1);
                camelCaseString = camelCaseString + part.replaceFirst(oldFirstChar, oldFirstChar.toUpperCase());
            } else {
                camelCaseString = camelCaseString + part + " ";
            }
            i++;
        }
    }
    return camelCaseString;
}

public static void main(String[] args) {
    String string = "HI_tHiS_is_SomE Statement";
    System.out.println(toCamelCase(string));
}

Solution 16 - Java

Sorry for mine five cents, I think in java too many words)) I just wondering. Why is the regexp engine in java not so familiar with lambdas as in JS((

Anyway. With java 8+ construction appears in my mind:

Arrays.stream("THIS_IS_AN_EXAMPLE_STRING".split("_"))
    .collect(StringBuilder::new,
        (result, w) -> result
            .append(w.substring(0, 1).toUpperCase())
            .append(w.substring(1).toLowerCase()),
        StringBuilder::append)
    .toString())

If you care about memory consumption, the below code care about it:

"THIS_IS_AN_EXAMPLE_STRING".chars().collect(StringBuilder::new,
    (result, c) -> {
        // Detect place for deal with
        if (result.length() > 0 && result.charAt(result.length() - 1) == '_') {
            result.setCharAt(result.length() - 1,
                    Character.toUpperCase((char) c));
        } else if (result.length() > 0) {
            result.append(Character.toLowerCase((char) c));
        } else {
            result.append(Character.toUpperCase((char) c));
        }
    }, StringBuilder::append).toString()

Solution 17 - Java

It will convert Enum Constant into Camel Case. It would be helpful for anyone who is looking for such funtionality.

public enum TRANSLATE_LANGUAGES {
    	ARABIC("ar"), BULGARIAN("bg"), CATALAN("ca"), CHINESE_SIMPLIFIED("zh-CN"), CHINESE_TRADITIONAL("zh-TW"), CZECH("cs"), DANISH("da"), DUTCH("nl"), ENGLISH("en"), ESTONIAN("et"), FINNISH("fi"), FRENCH(
    			"fr"), GERMAN("de"), GREEK("el"), HAITIAN_CREOLE("ht"), HEBREW("he"), HINDI("hi"), HMONG_DAW("mww"), HUNGARIAN("hu"), INDONESIAN("id"), ITALIAN("it"), JAPANESE("ja"), KOREAN("ko"), LATVIAN(
    			"lv"), LITHUANIAN("lt"), MALAY("ms"), NORWEGIAN("no"), PERSIAN("fa"), POLISH("pl"), PORTUGUESE("pt"), ROMANIAN("ro"), RUSSIAN("ru"), SLOVAK("sk"), SLOVENIAN("sl"), SPANISH("es"), SWEDISH(
    			"sv"), THAI("th"), TURKISH("tr"), UKRAINIAN("uk"), URDU("ur"), VIETNAMESE("vi");
    
    	private String code;
    
    	TRANSLATE_LANGUAGES(String language) {
    		this.code = language;
    	}
    
    	public String langCode() {
    		return this.code;
    	}
    
    	public String toCamelCase(TRANSLATE_LANGUAGES lang) {
    		String toString = lang.toString();
    		if (toString.contains("_")) {
    			String st = toUpperLowerCase(toString.split("_"));
    		}
    
    		return "";
    	}
    
    	private String toUpperLowerCase(String[] tempString) {
    		StringBuilder builder = new StringBuilder();
    
    		for (String temp : tempString) {
    
    			String char1 = temp.substring(0, 1);
    			String restString = temp.substring(1, temp.length()).toLowerCase();
    			builder.append(char1).append(restString).append(" ");
    
    		}
    
    		return builder.toString();
    	}
    }

Solution 18 - Java

One more solution to this may be as follows.

public static String toCamelCase(String str, String... separators) {
    String separatorsRegex = "\\".concat(org.apache.commons.lang3.StringUtils.join(separators, "|\\"));
    List splits = Arrays.asList(str.toLowerCase().split(separatorsRegex));
    String capitalizedString = (String)splits.stream().map(WordUtils::capitalize).reduce("", String::concat);
    return capitalizedString.substring(0, 1).toLowerCase() + capitalizedString.substring(1);
}

Solution 19 - Java

public static final String	UPPER_CAMEL	= "initUp";
public static final String	LOWER_CAMEL	= "initLow";

public String toCamel(String src, String separator, String format) {
	StringBuilder builder = new StringBuilder(src.toLowerCase());
	int len = builder.length();

	for (int idx = builder.indexOf(separator); idx > 0 && idx < len; idx = builder.indexOf(separator, idx)) {
		builder = builder.replace(idx, idx + 2, (String.valueOf(builder.charAt(idx + 1)).toUpperCase()));
	}

	switch (format) {
	case LOWER_CAMEL:
		builder.setCharAt(0, Character.toLowerCase(builder.charAt(0)));
		break;
	default:
		builder.setCharAt(0, Character.toUpperCase(builder.charAt(0)));
		break;
	}

	return builder.toString();

}

Invocation as

toCamel("THIS_IS_AN_EXAMPLE_STRING", "_", UPPER_CAMEL)

Execution Time: 14 ms

Solution 20 - Java

A simple snnipet:

 public static String camelCase(String in) {
    if (in == null || in.length() < 1) { return ""; } //validate in
    String out = "";
    for (String part : in.toLowerCase().split("_")) {
        if (part.length() < 1) { //validate length
            continue;
        }
        out += part.substring(0, 1).toUpperCase();
        if (part.length() > 1) { //validate length
            out += part.substring(1);
        }
    }
    return out;
}

Solution 21 - Java

    protected String toCamelCase(CaseFormat caseFormat, String... words){
        if (words.length  == 0){
          throw new IllegalArgumentException("Word list is empty!");
        }

        String firstWord = words[0];
        String [] restOfWords = Arrays.copyOfRange(words, 1, words.length);

        StringBuffer buffer = new StringBuffer();
        buffer.append(firstWord);
        Arrays.asList(restOfWords).stream().forEach(w->buffer.append("_"+ w.toUpperCase()));

        return CaseFormat.UPPER_UNDERSCORE.to(caseFormat, buffer.toString());

    }

Solution 22 - Java

Java 8 for multiple strings:

import com.google.common.base.CaseFormat;
    
    
    
String camelStrings = "YOUR_UPPER, YOUR_TURN, ALT_TAB";
    
List<String> camelList = Arrays.asList(camelStrings.split(","));
camelList.stream().forEach(i -> System.out.println(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, i) + ", "));

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMatt BallView Question on Stackoverflow
Solution 1 - JavaArnout EngelenView Answer on Stackoverflow
Solution 2 - JavaDan GravellView Answer on Stackoverflow
Solution 3 - JavaC. RossView Answer on Stackoverflow
Solution 4 - JavalibruchaView Answer on Stackoverflow
Solution 5 - JavaAlex BView Answer on Stackoverflow
Solution 6 - JavaMikeView Answer on Stackoverflow
Solution 7 - JavaYishaiView Answer on Stackoverflow
Solution 8 - JavaJacob van LingenView Answer on Stackoverflow
Solution 9 - JavaHendy IrawanView Answer on Stackoverflow
Solution 10 - JavaleorleorView Answer on Stackoverflow
Solution 11 - JavaSrisaView Answer on Stackoverflow
Solution 12 - JavaAshishView Answer on Stackoverflow
Solution 13 - JavaMuzikantView Answer on Stackoverflow
Solution 14 - JavaXORG_99View Answer on Stackoverflow
Solution 15 - JavaRoWiView Answer on Stackoverflow
Solution 16 - JavaVanya UsalkoView Answer on Stackoverflow
Solution 17 - JavaAZ_View Answer on Stackoverflow
Solution 18 - JavaSajaniView Answer on Stackoverflow
Solution 19 - JavaArindamView Answer on Stackoverflow
Solution 20 - JavafitorecView Answer on Stackoverflow
Solution 21 - JavaVladimirView Answer on Stackoverflow
Solution 22 - JavaDET66View Answer on Stackoverflow