我正在进行密码验证例程,并且很惊讶地发现VB不会将'*'视为Char.IsSymbol()检查的符号。 以下是QuickWatch的输出:
char.IsSymbol("*") False Boolean
MS documentation未指定IsSymbol匹配的字符,但暗示包含标准数学符号here。
有没有人对匹配所有标准美国特殊字符有什么好主意?
答案 0 :(得分:9)
此上下文中符号的字符:UnicodeCategory.MathSymbol
命名空间中的UnicodeCategory.CurrencySymbol
,UnicodeCategory.ModifierSymbol
,UnicodeCategory.OtherSymbol
和System.Globalization
。这些是分别指定为Sm,Sc,Sk和So的Unicode字符。所有其他字符都会返回False
。
来自.Net来源:
internal static bool CheckSymbol(UnicodeCategory uc)
{
switch (uc)
{
case UnicodeCategory.MathSymbol:
case UnicodeCategory.CurrencySymbol:
case UnicodeCategory.ModifierSymbol:
case UnicodeCategory.OtherSymbol:
return true;
default:
return false;
}
}
或转换为VB.Net:
Friend Shared Function CheckSymbol(uc As UnicodeCategory) As Boolean
Select Case uc
Case UnicodeCategory.MathSymbol, UnicodeCategory.CurrencySymbol, UnicodeCategory.ModifierSymbol, UnicodeCategory.OtherSymbol
Return True
Case Else
Return False
End Select
End Function
CheckSymbol
由IsSymbol
使用给定char的Unicode类别调用。
由于*
属于OtherPunctuation
类别(您可以使用char.GetUnicodeCategory()
进行检查),因此不会将其视为符号,方法正确返回False
。
要回答您的问题:使用char.GetUnicodeCategory()
检查角色属于哪个类别,并决定是否将其包含在您自己的逻辑中。
答案 1 :(得分:4)
如果您只是需要知道该字符不是数字或字母, 只使用
!char.IsLetterOrDigit(c)
最好是
&& !char.IsControl(c)
答案 2 :(得分:0)
也许你有编译器选项“严格”,因为
Char.IsSymbol("*")
我收到编译错误
BC30512: Option Strict On disallows implicit conversions from 'String' to 'Char'.
要在VB.NET中定义字符文字,必须在字符串中添加c,如下所示:
Char.IsSymbol("*"c)