我有一个Xamarin应用程序,用于解析包含查询字符串的扫描QR码。有时,用户会扫描无法拆分为字典的其他代码。我根据我发现的一些例子写了以下内容,但它看起来有点难看:
var parts = query.Split(new[] { '&' });
try
{
return parts.Select (
part => part.Split (new [] { '=' }))
.ToDictionary(
pair => { try { return pair [0]; } catch { return string.Empty; } },
pair => { try { return pair [1]; } catch { return string.Empty; } }
);
}
catch
{
return null; // eat
}
有没有更好的方法来解决这个问题?
答案 0 :(得分:0)
我想正则表达式就是你要找的东西。它解决了验证问题并避免了第一次拆分和选择
string validUrl = "http://www.contoso.com/data?foo=bar&bar=foo";
foreach (Match match in Regex.Matches(validUrl, @"(\?|\&)([^=]+)\=([^&]+)"))
{
Console.WriteLine(match.Value.TrimStart('&','?'));
}
答案 1 :(得分:0)
对您从QR代码扫描程序接收的网址进行预验证。这将允许您摆脱使用空捕获吞咽异常所做的黑客攻击。
public IDictionary<string, string> GetParams(string query)
{
// Perform a validation if URL is valid
var regex = @"^http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$";
Regex validator = new Regex(regex, RegexOptions.Compiled);
if (!validator.IsMatch(query))
{
return null;
// or
// throw new ArgumentException("Invalid Url");
}
var parts = query.Split('?')[1].Split('&');
return parts.Select(part => part.Split(new[] { "=" }, 2, StringSplitOptions.RemoveEmptyEntries))
.ToDictionary(
pair =>
{
return pair[0];
},
pair =>
{
return pair[1];
}
);
}
将查询字符串解析为字典比使用正则表达式进行解析更方便。