我需要能够根据可能的美国邮政服务州缩写列表验证字符串,而Google并没有向我提供任何指示。
我知道明显的解决方案:那就是编写一个非常庞大的if(或switch)语句来检查和比较所有50个状态,但我问的是StackOverflow,因为必须有一个更简单的方法来做到这一点。是否有任何RegEx或枚举器对象可用于以最有效的方式快速执行此操作?
顺便提一下[C#和.net 3.5]
答案 0 :(得分:19)
我喜欢这样的事情:
private static String states = "|AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|";
public static bool isStateAbbreviation (String state)
{
return state.Length == 2 && states.IndexOf( state ) > 0;
}
此方法的优点是使用可能使用单个机器指令进行搜索的优化系统例程。如果我正在处理非固定长度的单词,那么我会检查“|” +州+“|”确保我没有击中子串而不是完全匹配。由于字符串连接,这将花费更长的时间,但它仍然会在固定的时间内匹配。如果要验证小写缩写以及大写,则检查state.UpperCase(),或将'states'字符串加倍以包含小写变体。
我保证每次都会击败Regex或Hashtable查找,无论你运行多少次,并且内存使用量最少。
答案 1 :(得分:15)
我将使用有效缩写填充哈希表,然后使用输入进行检查以进行验证。如果每个字典构建有多个检查,它会更清晰,也可能更快。
答案 2 :(得分:8)
HashSet< string>是我能想到使用.NET 3.5中的内置类型的最干净的方法。 (您可以轻松地使其不区分大小写,或者将其更改为Dictionary< string,string>其中值为全名。这也是.NET 2.0 / 3.0最合适的解决方案。)
至于速度 - 你真的相信这会成为你代码的瓶颈吗? HashSet很可能“非常好”(每秒数百万次查找)。我相信替代品会更快 - 但更脏。在你有理由相信它会成为一个瓶颈之前,我会坚持最简单的方法。
(编辑明确提及词典<,>。)
答案 3 :(得分:4)
这是一个正则表达式。享受!
^(?-i:A[LKSZRAEP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$