在Java中,有所谓的方法isJavaIdentifierStart
和isJavaIdentifierPart
对可用于判断一个字符串是一个有效的Java标识,像这样的字符类别:
public boolean isJavaIdentifier(String s) { int n = s.length(); if (n==0) return false; if (!Character.isJavaIdentifierStart(s.charAt(0))) return false; for (int i = 1; i < n; i++) if (!Character.isJavaIdentifierPart(s.charAt(i))) return false; return true; }
C#有这样的东西吗?
是:
// using System.CodeDom.Compiler; CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); if (provider.IsValidIdentifier (YOUR_VARIABLE_NAME)) { // Valid } else { // Not valid }
从这里:如何确定字符串是否是有效的变量名称?
我会对这里提供的其他解决方案保持警惕.调用CodeDomProvider.CreateProvider需要查找和解析Machine.Config文件以及app.config文件.这可能比检查你自己的弦所需的时间慢几倍.
相反,我会主张你做出以下改变之一:
将提供程序缓存在静态变量中.
这将使您仅创建一次创建它,但它会减慢类型加载速度.
通过创建自己的Microsoft.CSharp.CSharpCodeProvider实例直接创建提供程序
这将跳过配置文件一起解析.
编写代码来实现检查你自己.
如果这样做,您可以最大程度地控制其实施方式,如果需要,可以帮助您优化性能.有关C#标识符的完整词法语法,请参阅C#语言规范的 2.2.4节.
基本上是这样的:
const string start = @"(\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl})"; const string extend = @"(\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf})"; Regex ident = new Regex(string.Format("{0}({0}|{1})*", start, extend)); s = s.Normalize(); return ident.IsMatch(s);