2

MCCORMIC 3H RFinal08-26-2011.dwgまたはMCCORMICSMITH2N L Final 08-26-2011.dwgのような文字列があり、最初の文字列のRまたは2番目の文字列の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

私は似たようなことをしなければなりませんでしたが、Autocadの代わりにMirostationの図面を使用しました。私の場合は正規表現を使用しました。もっと複雑にしたいと思った場合に備えて、これが私がしたことです。

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 に答える
2

Odedの答えがすべての場合を網羅しているとは思いません。最初の例では、必要な文字の前に2つの単語があり、2番目の例ではその前に3つの単語があります。

私の意見では、この文字を取得する最良の方法は、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;
}

そして、これが正規表現パターンの説明です:

\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 に答える