2

如果我有一个像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 
4

3 回答 3

3

只是按空间分割:

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

WhichArea = parts[parts.Length - 3];

看起来文件名具有非常特定的格式,因此可以正常工作。

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

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

于 2012-09-05T18:43:52.850 回答
2

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

我的观点是获得这封信的最好方法是使用 RegEx,假设这个词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.
于 2012-09-05T19:32:06.053 回答
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;
}
于 2012-09-05T19:28:17.117 回答