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

本文关键字:字符串部 提取 | 更新日期: 2023-09-27 18:03:58

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

{"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();

但是当我尝试编译时,它说id后面的冒号"无法识别的转义序列"。

我使用的Regex表达式是:

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

但我不确定如何把它放在正则表达式内。匹配(我试图将'放在"之前,但它显示无法识别的转义序列)

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

regex错误是正确的——:不是正则表达式中的特殊字符(除了上下文上下文中的(?:)组),所以它不能被转义。(请注意,这里有两个级别的转义:当':在c#字符串中看到时,c#编译器决定:不是特殊的,因此无声地将其与前面的文字反斜杠分开;然后,正则表达式引擎尝试解释它并生成错误。)

一个你想要的正则表达式(无论如何,对于示例字符串)是:

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

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

这样的数据)。

不要使用正则表达式来尝试解析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方法,则不需要类,但它不是强类型的。

您真的需要使用正则表达式处理字符串吗?如果字符串总是保存正确格式的JSON,那么使用专门构建的JSON解析器会更快、更容易、更少出错:

string yourString = "{'"version'":'"5.14.1'",'"id'":'"ABCD'",'"key'":'"266'"}";    // etc
dynamic json = JsonConvert.DeserializeObject(yourString);
Console.WriteLine(json.id);    // displays ABCD

明白了

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