【发布时间】:2010-12-16 07:57:56
【问题描述】:
我想更改一个字符串,使所有大写字符变为小写,所有小写字符变为大写。数字字符会被忽略。
所以“AbCdE123”变成了“aBcDe123”
我想一定有一种方法可以遍历字符串并翻转每个字符,或者可能是一些可以做到这一点的正则表达式。
【问题讨论】:
-
不,这种情况下不能使用正则表达式。
标签: java string case case-sensitive
我想更改一个字符串,使所有大写字符变为小写,所有小写字符变为大写。数字字符会被忽略。
所以“AbCdE123”变成了“aBcDe123”
我想一定有一种方法可以遍历字符串并翻转每个字符,或者可能是一些可以做到这一点的正则表达式。
【问题讨论】:
标签: java string case case-sensitive
Apache Commons StringUtils 有一个swapCase 方法。
【讨论】:
我想一定有办法遍历字符串并翻转每个字符
正确。 java.lang.Character 类为您提供了每个 isUpperCase() 方法。对其进行测试并根据结果使用toLowerCase() 或toUpperCase() 方法。将每个结果附加到StringBuilder,你应该没问题。
【讨论】:
我不相信有任何内置功能可以做到这一点(这相对不寻常)。不过应该这样做:
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 字符。
【讨论】:
我确实意识到给定的线程已经很老了,但是有更好的解决方法:
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);
}
}
【讨论】:
check,至少它不是很具有描述性。还;这是风格/品味的问题,但如果由我决定,我会写 if (Character.isUpperCase(c)) 而不是先分配 check 然后检查变量...
我们也可以使用 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();
}
【讨论】:
基于 Faraz 的方法,我认为字符转换可以这么简单:
t += Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c);
【讨论】:
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
【讨论】:
XORing with space),它似乎有效,但我以前从未听说过这个,所以你能解释一下为什么它有效? ASCII 表的设计从一开始就考虑到这一点吗?
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 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 有一个 append(char) 方法 + Character.toUpperCase 和 toLowerCase 都只是静态方法。我只是对唯一的 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();
}
【讨论】:
Character.toUpperCase 用于 if false 条件,但我想您是对的,让我清理一下