提取具有特定限制的字符串部分

时间:2015-07-22 16:01:45

标签: c# arrays string

我有一个小问题。我的字符串具有以下格式;

{"version":"5.14.1","id":"ABCD","key":"266",...... etc

我希望在" id"之后获得ABCD。这就是我试过的

我试过

string[] output;
output = Regex.Matches(site,"(?<=(?:\"id\")\:\")([^\"]+)").Cast<Match>().Select(m => m.Value).ToArray();

但是当我尝试编译它时说&#34;无法识别的转义序列&#34;为id后的冒号。

我使用的正则表达式是:

(?<=(?:"id")\:")([^"]+)

但是我不确定如何把它放在Regex.Matches中(我试图在\#34之前放置\;但它表示无法识别的转义序列)

4 个答案:

答案 0 :(得分:0)

正则表达式错误是正确的 - :不是正则表达式中的特殊字符(例如(?:)组中的上下文除外),因此无法对其进行转义。 (注意,这里有两个转义级别:当在C#字符串中看到\:时,C#编译器决定:不是特殊的,所以默默地保留它前面的文字反斜杠然后,正则表达式引擎尝试解释它并生成错误。)

执行所需操作的正则表达式(对于示例字符串,无论如何)是:

"\"id\":\"([^\"]+)"

但我建议使用正确的解析器,因为这看起来很像JSON。正则表达式很方便,但它在这里使用一个输入假设很多(例如可能有像{'foo':'"id":"hmm"',"id": "realid"...

这样的数据

答案 1 :(得分:0)

不要使用正则表达式来尝试解析JSON,它不会涵盖所有场景,而你只是在反对那些应该很容易的事情。

创建一个类来容纳您需要的属性:

 class MyData { 
   public string Version { get; set; }
   public string Id { get; set; }
   ...
 }

安装NuGet包Newtonsoft JSON:install-package Newtonsoft.Json

string myData = "{\"version\":\"5.14.1\",\"id\":\"ABCD\" }";

MyData data = JsonConvert.DeserializeObject<MyData>(myData);
Dictionary<string, string> dataAsDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(myData);
string abcd = data.Id;
abcd = dataAsDictionary["id"];

如果您使用Dictionary方法,则不需要课程,但不是强类型。

答案 2 :(得分:0)

你真的需要使用正则表达式来处理字符串吗?如果字符串将始终保持正确形成的JSON,那么使用a purpose-built JSON parser会更快,更容易且更不容易出错:

string yourString = "{\"version\":\"5.14.1\",\"id\":\"ABCD\",\"key\":\"266\"}";    // etc

dynamic json = JsonConvert.DeserializeObject(yourString);
Console.WriteLine(json.id);    // displays ABCD

答案 3 :(得分:-1)

搞定了

output = Regex.Matches(site,"(?<=(?:\"id\")\\:\")([^\"]+)").Cast<Match>().Select(m => m.Value).ToArray();