【问题标题】:Search string pattern搜索字符串模式
【发布时间】:2012-08-30 13:08:57
【问题描述】:

如果我有一个像 MCCORMIC 3H R Final 08-26-2011.dwg 甚至 MCCORMIC SMITH 2N L Final 08-26-2011.dwg 这样的字符串,我想要捕获变量中第一个字符串中的 R 或第二个字符串中的 L,这样做的最佳方法是什么?我正在考虑尝试以下语句,但它不起作用。

string filename = "MCCORMIC 3H R Final 08-26-2011.dwg"
string WhichArea = "";
int WhichIndex = 0;

WhichIndex = filename.IndexOf("Final");
WhichArea = filename.Substring(WhichIndex - 1,1); //Trying to get the R in front of word Final 

【问题讨论】:

    标签: c# regex substring indexof


    【解决方案1】:

    只按空格分割:

    var parts = filename.Split(new [] {' '}, 
                                StringSplitOptions.RemoveEmptyEntries);
    
    WhichArea = parts[parts.Length - 3];
    

    看起来文件名有一个非常特定的格式,所以这样就可以了。

    即使有任意数量的空格,使用StringSplitOptions.RemoveEmptyEntries 也意味着空格不会成为拆分结果集的一部分。

    更新代码以处理这两个示例 - thanks Nikola

    【讨论】:

    • @Oded- 抱歉,我应该更具体一些。单词Final之前可以有未确定的空格
    • @DaBears - 已更新答案(使用重载采用 StringSplitOptions)。
    • @Oded- 我只是想理解这一点。所以这只会消除空间吗?在单词 Final 之前可能有无限数量的空格,它如何知道在第一个字符串示例中得到字母 R?
    • 这将不包括文件名为 MCCORMIC SMITH 2N L Final 08-26-2011.dwg 的情况。
    【解决方案2】:

    我不认为Oded's answer 涵盖所有情况。第一个例子在通缉的字母前面有两个词,第二个例子在它前面有三个词。

    我认为获取这封信的最佳方法是使用正则表达式,假设单词Final 总是出现在字母本身之后,由任意数量的空格分隔。

    这是正则表达式代码:

    using System.Text.RegularExpressions;
    
    private string GetLetter(string fileName)
    {
        string pattern = "\S(?=\s*?Final)";
        Match match = Regex.Match(fileName, pattern);
        return match.Value;
    }
    

    下面是RegEx模式的解释:

    \S(?=\s*?Final)
    
    \S // Anything other than whitespace
    (?=\s*?Final) // Positive look-ahead
        \s*? // Whitespace, unlimited number of repetitions, as few as possible.
        Final // Exact text.
    

    【讨论】:

      【解决方案3】:

      我必须做类似的事情,但使用 Mirostation 图纸而不是 Autocad。我在我的情况下使用了正则表达式。这就是我所做的,以防万一你想让它变得更复杂。

      string filename = "MCCORMIC 3H R Final 08-26-2011.dwg"; 
      string filename2 = "MCCORMIC SMITH 2N L Final 08-26-2011.dwg";
      
      Console.WriteLine(TheMatch(filename));
      Console.WriteLine(TheMatch(filename2));
      
      public string TheMatch(string filename) {   
          Regex reg = new Regex(@"[A-Za-z0-9]*\s*([A-Z])\s*Final .*\.dwg");
          Match match = reg.Match(filename);
          if(match.Success) {
              return match.Groups[1].Value;
          }
          return String.Empty;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-24
        • 2012-11-01
        • 2022-01-23
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多