在JAVA(Android)中,我试图在字符串中确定每个字符是否具有大写或小写的等效字符。
我的目标不是降低或升高案例,而是要知道是否可能。
例如,此函数将返回true:'e''''''''''''''''''''''' 表情符号或汉字的错误。
有没有可以做到这一点的功能?
编辑:为了更清楚,该函数应该为参数使用一个字符,而不是String,如果该字符没有大写或小写版本,则返回false。答案 0 :(得分:3)
你可以试试这个:
boolean validate(char c){
return Character.isUpperCase(c) || Character.isLowerCase(c);
}
如果只是一个大写或小写的字母,这将返回true
。否则它将返回false。
答案 1 :(得分:1)
对于一个简单的方法,有Character.isLowerCase。但实际上你需要小心 - 这取决于语言。有些语言可能有小写'é'但没有大写。或者像土耳其语“我”可能有不同的小写版本比其他语言。
要解决这个问题,我会使用像Character.isLetter(myChar) && String.valueOf(myChar).toLowerCase().equals(String.valueOf(myChar))
这样的东西。请记住使用toLowerCase版本,如果不在默认语言环境中进行比较,则将Locale作为参数。
答案 2 :(得分:1)
检查字符是小写字母还是大写字母:
Character.isLowerCase(ch) != Character.isUpperCase(ch)
或者,您可以比较角色的低层和高层形式:
Character.toLowerCase(ch) == Character.toUpperCase(ch)
但是,您需要注意语言环境(土耳其语中有一个字母,我认为大写和小写形式相同)。
答案 3 :(得分:1)
仍然没有完全指定要求(你是否关心大写/小写的等价是否与原来的不同的字符),但我对这个问题最直接的解释是:
对于给定字符串中的每个字符
ch
,toUpperCase(ch)
产生大写字符或toLowerCase(ch)
产生小写字符是真的吗?
我这样说是因为Character.toUpperCase()
返回“字符的大写等价物,如果有的话;否则,字符本身”。
String.toUppercase()
的{{3}}没有提到如果某些字符没有大写等价物会发生什么,但我认为我们可以假设它返回那些字符不变,Character.toUpperCase()
也是如此。
因此,直接实施该条件将是测试
Character.isUpperCase(s.toUpperCase().charAt(0)) ||
Character.isLowerCase(s.toLowerCase().charAt(0));
将每个字符作为字符串。
我在这里使用String
而不是Character
大小写转换函数,以便利用区域设置敏感的映射。不仅如此,不管语言环境如何,都有一些字符无法通过Character.toUpperCase()
转换为大写字母,因为它们的大写等价物不止一个字符!例如,我们会得到错误的\u00df'ß'结果(有关详情,请参阅doc)。
public class TestUpper {
public static void main(String[] args) {
final String test = "\u0633\u0644\u0627\u0645 World \u00df\u01c8eéilLOP\u76f4!";
for (Character ch : test.toCharArray()) {
System.out.format("'%c' (U+%04x): hasCase()=%b%n", ch, (int)ch, hasCase(ch));
}
}
static boolean hasCase(Character ch) {
String s = ch.toString();
// Does the character s have an uppercase or a lowercase equivalent?
return Character.isUpperCase(s.toUpperCase().charAt(0)) ||
Character.isLowerCase(s.toLowerCase().charAt(0));
}
}
结果:
'س' (U+0633): hasCase()=false
'ل' (U+0644): hasCase()=false
'ا' (U+0627): hasCase()=false
'م' (U+0645): hasCase()=false
' ' (U+0020): hasCase()=false
'W' (U+0057): hasCase()=true
'o' (U+006f): hasCase()=true
'r' (U+0072): hasCase()=true
'l' (U+006c): hasCase()=true
'd' (U+0064): hasCase()=true
' ' (U+0020): hasCase()=false
'ß' (U+00df): hasCase()=true
'Lj' (U+01c8): hasCase()=true
'e' (U+0065): hasCase()=true
'é' (U+00e9): hasCase()=true
'i' (U+0069): hasCase()=true
'l' (U+006c): hasCase()=true
'L' (U+004c): hasCase()=true
'O' (U+004f): hasCase()=true
'P' (U+0050): hasCase()=true
'直' (U+76f4): hasCase()=false
'!' (U+0021): hasCase()=false
这些测试用例包括阿拉伯字母和中文字符(isLetter()
,但没有大写/小写),请求的测试字母,空格和标点符号以及标题字母。
根据问题中目前陈述的标准,结果是正确的。但是,OP在评论中说他希望函数返回false
用于标题字符,例如U + 01c8,而上面的代码返回true
,因为它们具有大写和小写等价物(U + 01c7和U + 01c9)。但OP的陈述似乎是基于错误的印象,即标题字母不具有大写和小写等价物。正在进行的讨论尚未解决这一混乱局面。
免责声明:此答案并未尝试考虑补充或代理代码点。
答案 4 :(得分:-1)
两个字符串大写和小写不匹配并不一定意味着字符串有效。 true1
不等于TRUE1
,但未通过测试用例。你需要检查每个角色。这是一个粗略的剪辑,你可能不得不为表情符号和汉字做点什么。
public static boolean isAllCase(String value) {
String upper = value.toUpperCase();
String lower = value.toLowerCase();
if(upper.length() != lower.length())
return false;
for(int i = 0; i < upper.length(); i++) {
if(upper.charAt(i) == lower.charAt(i))
return false;
}
return true;
}
答案 5 :(得分:-1)
public boolean hasEquivalentCase(char ch) {
return (Character.isLowerCase(ch)) || Character.isUpperCase(ch)
}
答案 6 :(得分:-2)
public boolean validate(char value){
if( (value >= 'a' && value <= 'z') || (value >= 'A' &&
value <= 'Z')
return true;
return false;
}
这适用于你的String的每个字符。
public boolean All( String cad ){
for( int i = 0; i < cad.lenght() ; i++ ){
if( !validate(cad.charAt(i)) ){
#the letter has not upper or lower
return false;
}
}
return true;
}