あなたのURLを生成するコードを管理している場合は、私はそれをお勧めしますキーと値のペアの間にデリミタを挿入するように変更します。そのままでは、値の終わりと次のキーの開始位置を区別することは難しいです。
ここでは解決策を段階的に示します。
まず、(私はurlString
に存在すると仮定します)あなたのURLからクエリ文字列を抽出します。
それがコード化された方法に、クエリ文字列は、技術的には、単一のキーと値が含まれています原因
Uri uri = new Uri(urlString);
NameValueCollection outer = HttpUtility.ParseQueryString(uri.Query);
ペアであり、キーはk
である。残りのキーと値のペアは、の中にの範囲で、k
の値でエンコードされています。したがって、その値を取得してデコードします:
string k = outer["k"];
string decoded = HttpUtility.UrlDecode(k);
次の部分は難しいです:あなたのキーと値を抽出することです。我々は、これらを一致させるための正規表現を使用しなければならない:
var matches = Regex.Matches(decoded, @"(?<key>\w+):(?<value>.*?)(?= \w+:|$)");
私たちは、あなたの鍵が唯一の単語文字(文字、数字、およびアンダースコア)で構成されていることを前提としなければなりません。したがって、それらは(?<key>\w+)
と一致します。各キーの後には:
文字が続きます。次に、値は任意の文字列、(?<value>.*?)
で構成されます。ただし、別のキーの\w+:
、または文字列の末尾のいずれかを続ける必要があります。$
。したがって、これらのいずれかを照合するための積極的な先読みを使用します。
最後に、ちょうど辞書にどんな試合を変換:
IDictionary<string, string> dictionary = matches.Cast<Match>().ToDictionary(
m => m.Groups["key"].Value,
m => m.Groups["value"].Value);
複合、これはあなたを与えるだろう:
Uri uri = new Uri(urlString);
NameValueCollection outer = HttpUtility.ParseQueryString(uri.Query);
string k = outer["k"];
string decoded = HttpUtility.UrlDecode(k);
var matches = Regex.Matches(decoded, @"(?<key>\w+):(?<value>.*?)(?= \w+:|$)");
IDictionary<string, string> dictionary = matches.Cast<Match>().ToDictionary(
m => m.Groups["key"].Value,
m => m.Groups["value"].Value);
をあなたはJSまたはC#でそれを解析しようとしていますか? –
いずれかが私のために働くでしょう。ありがとう –