【问题标题】:C#: String inside Last brackets() of a stringC#:字符串的最后一个括号()内的字符串
【发布时间】:2016-06-09 12:41:55
【问题描述】:

在我的一项任务中,我必须在错误状态的最后一组括号内找到错误的 ID。我列出了一些示例错误状态。

错误状态(字符串)看起来像,

Case 1: Bug A is resolved (XID: X015)
Case 2: Bug B is resolved (ZID: X016)
Case 3: Bug C is resolved (Data issue) (SID: X017)

对于案例 #1 和 #2 ,我编写了类似的代码,找到 ( 和 ) 的第一次出现,并计算括号内的值。

var start = value.IndexOf("(", StringComparison.Ordinal) + 1;
var end = value.IndexOf(")", start, StringComparison.Ordinal);
var BugID = value.Substring(start, end - start);

但是在案例 #3 中,有两组括号,第一组包含关于错误的摘要,下一组是实际错误 ID,我需要提取错误 ID。 我必须编写这样的代码,

var start = value.IndexOf(last "(");    //index of last (
var end = value.IndexOf(last ")");  //index of last )
var BugID = value.Substring(start, end - start);

任何建议都会有所帮助!

【问题讨论】:

  • IndexOf(last, "(ID:") 呢?
  • 这会有所不同。 :( 。仅括号不变。我已经相应地编辑了示例。@LasseV.Karlsen
  • value.LastIndexOf("(")怎么样
  • 还有诸如正则表达式之类的东西......在这种情况下可能会有所帮助。
  • 我相信如果你在字符串上做了.Split(':'),那么你的ID应该在返回的string[]对象中作为splitString[1]。但是,可能会有一个可以轻松删除的尾随空格。

标签: c# regex string indexof brackets


【解决方案1】:

类似这样的:

  String source = "Some (123) test (valid value) with ugly -> ( <- tricks";
  String result = null; // what if source doesn´t have brackets?

  int pClose = source.LastIndexOf(')');

  if (pClose >= 0) {
    int pOpen = source.LastIndexOf('(', pClose);

    if (pOpen >= 0)
      result = source.Substring(pOpen + 1, pClose - pOpen - 1);
  }

  ...
  // "valid value"
  Console.Write(result);

【讨论】:

  • 不知道为什么每个人都对正则表达式如此着迷,而一个简单的LastIndexOf 就可以解决问题。 +1 先生。
【解决方案2】:

试试 LastIndexOf(...) 字符串方法。

var start = value.LastIndexOf(" (") + 1;

【讨论】:

  • 有一个ugly test会失败:"(wrong) then (right value) then trick (",请注意最后一个悬空"("
【解决方案3】:
var strings = new List<string>
{
    "Case 1: Bug A is resolved (XID: X015)",
    "Case 2: Bug B is resolved (ZID: X016)",
    "Case 3: Bug C is resolved (Data issue) (SID: X017)"
};

foreach (var s in strings)
{
    var result = s.Substring(s.LastIndexOf('('));

    System.Console.WriteLine(result.Trim('(', ')'));
}

返回:

XID: X015

ZID:X016

SID:X017

编辑:使用 Trim() 去掉括号!

【讨论】:

    【解决方案4】:

    正则表达式是你的朋友。 Regexp.Matches() 方法将找到给定模式的所有出现:

    var text = @"Case 1: Bug A is resolved (XID: X015)
    Case 2: Bug B is resolved (ZID: X016)
    Case 3: Bug C is resolved (Data issue) (SID: X017)";
    
    // Instantiate the regular expression object.
    Regex r = new Regex(@"\([^)]*\)", RegexOptions.Multiline);
    
    // Match the regular expression pattern against a text string.
    var matches = r.Matches(text);
    if(matches.Count > 0)
    {
         var last_match = matches[matches.Count - 1];
         Console.WriteLine(last_match.Groups[0].Value);
    }
    

    【讨论】:

      【解决方案5】:

      这里有一些可以提取 ID 号的工作代码。它包括 X,假设你想要那个。

      var lines = new[]
      {
          @"Case 1: Bug A is resolved (ID: X015)",
          "Case 2: Bug B is resolved (ID: X016)",
          "Case 3: Bug C is resolved (Data issue) (ID: X017)"
      };
      
      foreach(var line in lines)
      {
      
          Regex regex = new Regex(@"(?<=[(]ID:\s)X\d*(?=[)])");
      
          Match match = regex.Match(line);
      
          if(match.Success)
          {
              Console.WriteLine(match.Value);
          }
      }
      
      Console.ReadLine();
      

      如果你想玩 Regex,这里有一个很好的工具:

      https://regex101.com/

      【讨论】:

        【解决方案6】:

        使用 Regexp,你可以这样写(用 LINQPad 测试):

        void Main()
        {
            string a = "Bug A is resolved (XID: X015)";
            string b = "Bug B is resolved (ZID: X016)";
            string c = "Bug C is resolved (Data issue) (SID: X017)";
        
            var regex = new System.Text.RegularExpressions.Regex(@"(\([^(]*\))$");
        
            Console.WriteLine(string.Format("a: {0}", regex.IsMatch(a) ? "YES" : "NO"));
            Console.WriteLine(string.Format("b: {0}", regex.IsMatch(b) ? "YES" : "NO"));
            Console.WriteLine(string.Format("c: {0}", regex.IsMatch(c) ? "YES" : "NO"));
        
            var aMatches = regex.Matches(a);
            var bMatches = regex.Matches(b);
            var cMatches = regex.Matches(c);
        
            Console.WriteLine(string.Format("a: {0}", aMatches[aMatches.Count - 1]));
            Console.WriteLine(string.Format("b: {0}", bMatches[bMatches.Count - 1]));
            Console.WriteLine(string.Format("c: {0}", cMatches[cMatches.Count - 1]));
        }
        

        【讨论】:

          【解决方案7】:

          这个怎么样

          using System.IO;
          using System;
          
          class Program
          {
              static void Main()
              {
                  var str = "Bug C is resolved (Data issue) (SID: X017)";
                  var index = str.IndexOf("ID: ");
                  Console.WriteLine(index);
                  // + 4 is the length of the string "ID: "
                  // so again we are subtracting it back along with -1 to remove the last paranthesis
                  str = str.Substring(index + 4, str.Length - index - 4 - 1);
                  Console.WriteLine(str);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-13
            • 2016-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-19
            • 2016-10-11
            • 2022-11-18
            相关资源
            最近更新 更多