如何在Java中反转String的大小写?

时间:2009-11-13 15:07:15

标签: java string case case-sensitive

我想更改一个String,以便所有大写字符变为小写,并且所有小写字符都变为大写。数字字符只是被忽略。

所以“AbCdE123”变成“aBcDe123”

我想必须有一种方法来遍历String并翻转每个字符,或者可能是一些可以执行此操作的正则表达式。

9 个答案:

答案 0 :(得分:20)

Apache Commons StringUtils有一个swapCase方法。

答案 1 :(得分:16)

我不相信有任何内置的东西(这是相对不寻常的)。这应该这样做:

public static String reverseCase(String text)
{
    char[] chars = text.toCharArray();
    for (int i = 0; i < chars.length; i++)
    {
        char c = chars[i];
        if (Character.isUpperCase(c))
        {
            chars[i] = Character.toLowerCase(c);
        }
        else if (Character.isLowerCase(c))
        {
            chars[i] = Character.toUpperCase(c);
        }
    }
    return new String(chars);
}

请注意,这不会执行String.toUpperCase / String.toLowerCase所做的特定于语言环境的更改。它也不处理非BMP字符。

答案 2 :(得分:2)

  

我想必须有一种方法来遍历字符串并翻转每个字符

正确。 java.lang.Character类为您提供了isUpperCase()方法。对其进行测试,并根据结果使用toLowerCase()toUpperCase()方法。将每个结果附加到StringBuilder,您应该没问题。

答案 3 :(得分:2)

基于Faraz的方法,我认为字符转换可以简单如下:

t += Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c);

答案 4 :(得分:1)

Java 8及更高版本:

String myString = "MySampleString123";
System.out.println(myString.chars().map(c -> Character.isLetter(c) ? c ^ ' ' : c).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString());

需要注意的是颠倒字母大小写的代码:

Character.isLetter(c) ? c ^ ' ' : c

答案 5 :(得分:0)

我们也可以使用StringBuilder对象,因为它有字符替换方法。但是,可能需要一些额外的空间来存储StringBuilder对象。因此,如果空间无关紧要并且使解决方案易于理解,那将会有所帮助。

String swapCase(String text) {
    StringBuilder textSB = new StringBuilder(text);
    for(int i = 0; i < text.length(); i++) {
        if(text.charAt(i) > 64 && text.charAt(i) < 91)
            textSB.setCharAt(i, (char)(text.charAt(i) + 32));
        else if(text.charAt(i) > 96 && text.charAt(i) < 123)
            textSB.setCharAt(i, (char)(text.charAt(i) - 32));
    }
    return textSB.toString();
}

答案 6 :(得分:0)

public class ReverseCase {
    public  static void main(String[] args){ 
        char[] char_arr = args[0].toCharArray();
        for (int i = 0; i < char_arr.length; i++) {
            if (Character.isLowerCase(char_arr[i])) {
                char_arr[i] = Character.toUpperCase(char_arr[i]);
            }else {
                char_arr[i] = Character.toLowerCase(char_arr[i]);
            }
        }
        String reversed = new String(char_arr);
        System.out.println(reversed);
    }
}

答案 7 :(得分:0)

我认为最容易理解的解决方案是:

#include <sw/redis++/redis++.h>                                                                                                    
#include<iostream>                                                                                                                                                                                                                                                    
using namespace sw::redis;                                                                                                                 
using namespace std;                                                                                                                                                                                                                                                  
struct person                                                                                                                      
{                                                                                                                                  
int age;                                                                                                                           
string name;                                                                                                                       
};                                                                                                                                                                                                                                                                    
int main(){                                                                                                                        
person p1;                                                                                                                         
p1.age=18;                                                                                                                         
p1.name="Abhishek";                                                                                                                                                                                                                                                   
try{                                                                                                                                       
auto redis_cluster = RedisCluster("tcp://127.0.0.1:30001");                                                                        
redis_cluster.set("person",StringView(&p1,size_t(sizeof(person))));                                                                
auto reply=redis_cluster.get("person");                                                                                            
if(reply){                                                                                                                                 
person* p2=*reply;                                                                                                                 
cout<<p2->age<<endl;                                                                                                       
}                                                                                                                          
}                                                                                                                                  catch(const Error &e){                                                                                                             cout<<"Error"<<endl;                                                                                                               
}                                                                                                                                  
}

我认为您可以更轻松地阅读它,并且StringBuilder无论如何都具有append(char)方法+ public static String reverseCase(String text) { StringBuilder sb = new StringBuilder(); for (char c : text.toCharArray()) sb.append((Character.isUpperCase(c)) ? Character.toLowerCase(c) : (Character.isLowerCase(c) ? Character.isUpperCase(c) : c)); return sb.toString(); } Character.toUpperCase都是静态方法。我感到很遗憾,唯一的StringBuilder示例也包含了ascii索引算法。

对于那些不喜欢三元表达式的人,这是等效的:

toLowerCase

答案 8 :(得分:-1)

我确实认识到给定的线程已经很老了,但有一种更好的解决方法:

class Toggle
{ 
    public static void main()
    { 
        String str = "This is a String";
        String t = "";
        for (int x = 0; x < str.length(); x++)
        {  
            char c = str.charAt(x);
            boolean check = Character.isUpperCase(c);
            if (check == true)
                t = t + Character.toLowerCase(c);
            else
                t = t + Character.toUpperCase(c);
        }
        System.out.println (t);
    }
}