检查大写/小写查询字符串的最佳方法

Posted

技术标签:

【中文标题】检查大写/小写查询字符串的最佳方法【英文标题】:Best way to check for upper/lower case query strings 【发布时间】:2012-05-03 16:54:21 【问题描述】:

我有一个问题,我需要从 url 中提取查询字符串参数。该参数可以是"Territory""territory" 或该单词的其他大写/小写变体。虽然以下适用于前两种情况,但我想知道是否有更好的方法?

IDictionary<string, string> queryString = htmlPage.Document.QueryString;

if (queryString.ContainsKey("territory"))

    ish.SetDefaultRegion(int.Parse(queryString["territory"]));
    // do something (the same something as below)

else if (queryString.ContainsKey("Territory"))

    ish.SetDefaultRegion(int.Parse(queryString["Territory"]));
    // do something (the same something as above)

我宁愿将查询字符串插入字典中忽略大小写(即,如果用户不小心输入了"TERRITORY",此代码将失败,那么我如何才能测试该单词是否存在而不管大小写?

【问题讨论】:

这可以帮助你。从 queryString 对象中获取密钥。将其转换为小写,然后与“领土”进行比较。这样你就不用担心外壳了。 @Krishna:如果您不知道它的大小写(除了遍历每个键),如何从 queryString 对象中准确获取键? @Cameron - 感谢您的澄清。这正是我的问题! Request.QueryString["territory"] 已经不区分大小写。在 URL 中是否为“Territory”、“territory”、“TeRrItOrY”等都没有关系。 @Doug 这很可能是真的,但 ContainsKey 查找仍然无法匹配“Territory”和“TeRrItOrY” - 因此,根据答案,在从 QueryString 创建字典时,一个案例 -需要不敏感的密钥比较器。 【参考方案1】:

使用带有不区分大小写的键比较器的字典:

var queryParams = new Dictionary<string, string>(
    HtmlPage.Document.QueryString,
    StringComparer.InvariantCultureIgnoreCase
);

if (queryParams.ContainsKey("territory")) 
    // Covers "territory", "Territory", "teRRitory", etc.

【讨论】:

警告:我相信 InvariantCultureIgnoreCase 是一个危险的选择。似乎 OrdinalIgnoreCase 是安全的选择。据我了解,InvariantCulture 将重音字母视为与非重音字母相同。所以我解释这意味着“resumeID”=“resuméID”。但我知道 OrdinalIgnoreCase 将“resumeID”和“resuméID”视为不同的字符串。免责声明:我没有对此进行测试,目前也没有时间这样做。网上的很多信息都是不好的建议,或者完全是错误的,所以我只是发布这个“小心这个”,我不确定。 :P @Shawn:你知道,OrdinalIgnoreCase 在这里可能是一个更好的默认值。但是,InvariantCultureIgnoreCase 肯定不认为resumeIDresuméID 相等(try it!)。我相信它只是在比较过程中进行了一种 Unicode 规范化(因此,e 后跟一个组合的重音符号将等于 e-with-acute-accent 字符),而 OrdinalIgnoreCase 按代码点检查代码点(尽管我可能是错的也是,呵呵)。还有更多信息here。【参考方案2】:

如果您的 QueryString 对象不是字典对象,而是诸如 NameValueCollection 之类的东西...

IDictionary<string, string> queryString = QueryString.AllKeys.ToDictionary(k => k.ToLowerInvariant(), k => QueryString[k]);

【讨论】:

但是当查询字符串包含仅大小写不同的“重复”键时,这个代码会中断(错误)吗?那么当查询字符串为 'abc=1&ABC=2' 时,这段代码会做什么呢?【参考方案3】:

你好,它也可以是TeRriTory,在查询字符串中做一个.Tolower()

【讨论】:

Querystring 是一个字典,你不能对它做tolower

以上是关于检查大写/小写查询字符串的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

python3字符串方法总结

正则表达式以匹配大写或小写的查询字符串

indexOf()忽略大小写方法

如何修改oracle数据库查询的默认大小写状态

Python3中isdigit(), isdecimal(), isnumeric()的区别和字符串的常用方法

python如何同时把字符串大写变小写,小写变大写