【问题标题】:How to search for a string in a string in C#?如何在 C# 中的字符串中搜索字符串?
【发布时间】:2017-12-16 03:52:56
【问题描述】:

我有以下字符串,我试图在其中获取StatusCode: 值,输出应该是409..我尝试如下但不工作,这样做的正确方法是什么?

string output = 'QLASR: Bad Response Conflict StatusCode: 409, ReasonPhrase: 'Improper Software Product Build Name already present in the database', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Pragma: no-cache Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept Cache-Control: no-cache Date: Tue, 11 Jul 2017 22:18:26 GMT Server: Microsoft-IIS/8.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Content-Length: 68 Content-Type: text/plain; charset=utf-8 Expires: -1 }'

output.Any(x => x.Equals(StatusCode))

【问题讨论】:

  • 单词是否总是StatusCode: 并且逗号总是跟随值?
  • @maccettura - 是的,你的假设是正确的
  • 另外,这看起来像是格式不正确的 JSON,应该是 JSON 吗?
  • 如果它是 JSON,那么只需反序列化为一个对象并在那里获取值。
  • 您可以根据不同程度的稳健性来实现这一点,具体取决于您可以对文本的形状做出哪些假设。如果您的输入还不是某种标准的可解析格式,并且编写合适的解析器工作量太大,则首选方法通常是使用正则表达式。

标签: c#


【解决方案1】:
const string statusCodeIdentifier = "StatusCode:";
var outputWithoutSpaces = output.Replace(" ", "");
var statusCodeIndex = outputWithoutSpaces.IndexOf(statusCodeIdentifier);
var parsedCode = outputWithoutSpaces.Substring(statusCodeIndex + statusCodeIdentifier.Length, 3);

不是最漂亮的,这假设状态代码始终是 3 位数字。但假设您的字符串始终采用这种格式,它应该可以工作。

您在 cmets 中提到输出应该是 JSON。不过,您的示例字符串中的情况似乎并非如此。如果它实际上是 JSON,那么我会改为使用 Newtonsoft.JSON 来反序列化对象并以这种方式处理它。它会更易于管理。

【讨论】:

    【解决方案2】:

    你不应该以这个字符串开头。这是一个improperly read HttpResponseMessage。有一些代码在某处发出 HTTP 请求,您可以从那里调用访问响应的 StatusCode 属性:

    httpClient = new HttpClient();
    var response = await httpClient.GetAsync("...");
    
    var statusCode = response.StatusCode;
    

    【讨论】:

      【解决方案3】:

      您可以找到StatusCode: 的索引,使用该索引并找到从该索引到, 索引的子字符串(您必须使用StatusCode: 的长度来获取值)

      【讨论】:

        【解决方案4】:

        正则表达式似乎是这里的最佳选择。

        int statusCode = 0;
        string output = 'QLASR: Bad Response Conflict StatusCode: 409, ...'
        string pattern = @"StatusCode\:\s?(\d+)";
        Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
        Match m = r.Match(output);
        if (m.Success)
        {
             statusCode = (int)m.Groups[1].Value;
             Debug.WriteLine(statusCode);
        }
        

        此正则表达式查找“​​StatusCode”,后跟一个冒号,后跟一个空格(或不是),后跟多个数字。 括号允许您对事物进行分组。

        因此,当执行此正则表达式时,它会匹配您的输出并找到“StatusCode:409”。然后,我们使用包含括号内的值的组 1 来获取您想要的状态代码。 (第 0 组 = 整场比赛;所以这将是 'StatusCode: 409')

        但是tbh,您的“输出”看起来像来自 HttpClient 的响应代码。 而且我确定响应具有可公开访问的 StatusCode 属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-10
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 2016-11-30
          相关资源
          最近更新 更多