如何反转 Java 中字符串的大小写?

发布于 2024-08-11 22:45:52 字数 135 浏览 3 评论 0原文

我想改变一个字符串,使所有大写字符变成小写,所有小写字符变成大写。数字字符将被忽略。

所以“AbCdE123”变成“aBcDe123”

我想一定有一种方法可以迭代字符串并翻转每个字符,或者也许有一些正则表达式可以做到这一点。

I want to change a String so that all the uppercase characters become lowercase, and all the lower case characters become uppercase. Number characters are just ignored.

so "AbCdE123" becomes "aBcDe123"

I guess there must be a way to iterate through the String and flip each character, or perhaps some regular expression that could do it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

南渊 2024-08-18 22:45:52

Apache Commons StringUtils 有一个 swapCase 方法。

Apache Commons StringUtils has a swapCase method.

静水深流 2024-08-18 22:45:52

我不相信有任何内置的东西可以做到这一点(这相对不寻常)。但这应该可以做到:

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 字符。

I don't believe there's anything built-in to do this (it's relatively unusual). This should do it though:

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);
}

Note that this doesn't do the locale-specific changing that String.toUpperCase/String.toLowerCase does. It also doesn't handle non-BMP characters.

煮酒 2024-08-18 22:45:52

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

Java 8 and above:

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

Code which is inverting the case of letter, is important to notice:

Character.isLetter(c) ? c ^ ' ' : c
青衫负雪 2024-08-18 22:45:52

我想一定有一种方法可以迭代字符串并翻转每个字符

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

I guess there must be a way to iterate through the String and flip each character

Correct. The java.lang.Character class provides you under each the isUpperCase() method for that. Test on it and make use of the toLowerCase() or toUpperCase() methods depending on the outcome. Append the outcome of each to a StringBuilder and you should be fine.

蓝海 2024-08-18 22:45:52

根据Faraz的方法,我认为字符转换可以很简单:

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

Based on Faraz's approach, I think the character conversion can be as simple as:

t += Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c);
泪是无色的血 2024-08-18 22:45:52

我认为最简单的解决方案是这样的:

public static String reverseCase(String text) {
    StringBuilder sb = new StringBuilder();
    for (char c : text.toCharArray())
        sb.append(Character.isUpperCase(c) ? 
                Character.toLowerCase(c) : 
                Character.toUpperCase(c));
    return sb.toString();
}

我认为您可以更轻松地阅读此内容,并且 StringBuilder 无论如何都有一个追加(char)方法+ Character.toUpperCasetoLowerCase两者都只是静态方法。我只是感觉很糟糕,因为唯一的 StringBuilder 示例也包含了 ascii 索引算术。

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

public static String reverseCase(String text) {
    StringBuilder sb = new StringBuilder();
    for (char c : text.toCharArray())
        if (Character.isUpperCase(c)) 
            c = Character.toLowerCase(c);
        else
            c = Character.toUpperCase(c);
        sb.append(c);
    return sb.toString();
}

编辑Java 8+(StringBuilder收集器代码取自@Arun的答案)

public static String reverseCase(String text) {
    return text.chars()
        .map(c -> Character.isUpperCase(c) ? 
            Character.toLowerCase(c) : 
            Character.toUpperCase(c))
        .collect(
            StringBuilder::new,
            StringBuilder::appendCodePoint,
            StringBuilder::append)
        .toString();
}

I think the simplest solution to understand would be something like:

public static String reverseCase(String text) {
    StringBuilder sb = new StringBuilder();
    for (char c : text.toCharArray())
        sb.append(Character.isUpperCase(c) ? 
                Character.toLowerCase(c) : 
                Character.toUpperCase(c));
    return sb.toString();
}

I think you can read through this easier and StringBuilder has an append(char) method anyways + Character.toUpperCase and toLowerCase are both just static methods. I just felt bad that the only StringBuilder example had ascii index arithmetics included as well.

For those who don't like ternary expressions, here's the equivalent:

public static String reverseCase(String text) {
    StringBuilder sb = new StringBuilder();
    for (char c : text.toCharArray())
        if (Character.isUpperCase(c)) 
            c = Character.toLowerCase(c);
        else
            c = Character.toUpperCase(c);
        sb.append(c);
    return sb.toString();
}

EDIT Java 8+ (StringBuilder collector code taken from @Arun's answer)

public static String reverseCase(String text) {
    return text.chars()
        .map(c -> Character.isUpperCase(c) ? 
            Character.toLowerCase(c) : 
            Character.toUpperCase(c))
        .collect(
            StringBuilder::new,
            StringBuilder::appendCodePoint,
            StringBuilder::append)
        .toString();
}
场罚期间 2024-08-18 22:45:52

我们还可以使用 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();
}

We can also use a StringBuilder object, as it has character replacing methods. However, it might take some extra space to store the StringBuilder object. So, it will help if space does not matter and keep the solution simple to understand.

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();
}
蘸点软妹酱 2024-08-18 22:45:52
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);
    }
}
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);
    }
}
肩上的翅膀 2024-08-18 22:45:52

我确实意识到给定的线程非常旧,但有更好的方法来解决它:

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);
    }
}

I do realize that the given thread is very old, but there is a better way of solving it:

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);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文