【问题标题】:In C#, what is the recommended way to parse out a word inside certain characters?在 C# 中,解析某些字符内的单词的推荐方法是什么?
【发布时间】:2015-02-21 04:56:32
【问题描述】:

在 C# 中,我有一个字符串进入,我正在读入一个看起来像这样的变量

var fullString = "Some random text (importantword)"

解析“重要词”的最简单方法是什么?正则表达式?只为“(”和“)”字符做 .IndexOf()?

【问题讨论】:

    标签: c# regex string parsing


    【解决方案1】:

    IndexOf 绝对是最简单的。

    https://msdn.microsoft.com/en-us/library/aa287734%28v=vs.71%29.aspx

    后跟一个子字符串。

    var startIndex = fullString.IndexOf("(") + 1;
    var endIndex = fullString.IndexOf(")");
    var targetWord = fullString.Substring(startIndex, endIndex - startIndex);
    

    编辑:正如下面的 cmets 所指出的,我忘记了 startIndex 是用于左括号而不是实际单词。

    【讨论】:

      【解决方案2】:

      正则表达式有两个缺点:它们可能比IndexOf() 慢,而且它们通常不容易阅读和理解。在您的情况下,查找括号中的文本很容易,不需要正则表达式。

      如果您的字符串总是以) 结尾,那么您可以只搜索( 并删除最后一个字符:

      var start = fullString.IndexOf('(') + 1;
      var end = fullString.Length - 1;
      return fullString.Substring(start, end - start);
      

      否则,进行两次搜索。在最后一种情况下,请记住使用 IndexOf(char, int) 重载以避免搜索整个字符串:

      var start = fullString.IndexOf('(') + 1;
      var end = fullString.IndexOf(')', start); // Notice the `start`
      return fullString.Substring(start, end - start);
      

      【讨论】:

      • 我不同意你的第二个缺点。请注意,您不能用基本功能做所有事情。
      • 我不知道我的答案中哪一部分更难
      • @AvinashRaj:这个:@"(?<=\()[^()]*(?=\))"。由于经验丰富,您可能对正则表达式感到满意,但我敢肯定,许多普通程序员将无法轻松阅读类似的表达式或在瞥一眼后发现其中的错误。
      • @MainMa 我对此表示同意 100%。这就是我通常避免使用正则表达式的原因。代码一次编写,多次阅读,所以我更喜欢意图清晰。
      【解决方案3】:

      您可以使用捕获组或环视来获取 () 括号之间的所有字符。

      String input = @"Some random text (importantword)";
      
      Regex rgx = new Regex(@"(?<=\()[^()]*(?=\))");
      
      foreach (Match m in rgx.Matches(input))
      Console.WriteLine(m.Groups[0].Value);
      

      String input = @"Some random text (importantword)";
      
      Regex rgx = new Regex(@"\(([^()]*)\)");
      
      foreach (Match m in rgx.Matches(input))
      Console.WriteLine(m.Groups[1].Value);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-28
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 2011-09-05
        • 2011-03-13
        相关资源
        最近更新 更多