搜索字符串模式

时间:2012-09-05 18:42:13

标签: c# regex substring indexof

如果我有一个字符串 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 

3 个答案:

答案 0 :(得分:3)

按空格划分:

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

WhichArea = parts[parts.Length - 3];

看起来文件名的格式非常具体,所以这样就可以了。

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

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

答案 1 :(得分:2)

我必须做类似的事情,但使用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;
}

答案 2 :(得分:2)

我认为Oded's answer不包括所有情况。第一个例子在通缉信之前有两个单词,第二个单词在它之前有三个单词。

我的观点是,获取此信函的最佳方式是使用RegEx,假设单词Final始终位于字母本身之后,由任意数量的空格分隔。

以下是RegEx代码:

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.