2012-02-15 7 views
0

MS Visual Studio 2010のC#。コード検証の一部として出力をログファイルに書き込みます。デバッガは、Match出力と同様に、グループが適切に一致していることを示します。唯一間違っているのは出力ファイルで、私はその理由を知らない。ここでは、ファイルから取得した出力を示します。readlineは入力行、MatchはRegexの一致結果、Slot/PortはRegexの名前付きグループから値を取得した結果です。ログからRegex Matchが入力行と一致することがわかります。デバッガは、名前付きグループが機能していると言います。ログファイルの出力がデバッガと一致しない

readline is: fc1/1 is up 
Match is: fc1/1 is 
Slot and Port are: 1/1 
readline is: fc1/3 is up 
Match is: fc1/3 is 
Slot and Port are: 1/1 

ここでは一致するコードを示します。デバッガでの表示を簡単にするために追加したものがいくつかあります。

if (RegexExtensions.TryMatch(out InterfaceMatch, trimmed, InterfaceMatchString)) 
       { 
        SlotNum = Convert.ToInt32(InterfaceMatch.Groups["slot"].Value); 
        PortNum = Convert.ToInt32(InterfaceMatch.Groups["port"].Value); 
        string slot = InterfaceMatch.Groups["slot"].Value; 
        string port = InterfaceMatch.Groups["port"].Value; 
    // write the value of current incoming readline 
        CiscoDecodeVariables.swlog.WriteLine(String.Format("readline is: {0}", readline)); 
// write the value of the current match 
        CiscoDecodeVariables.swlog.WriteLine(String.Format("Match is: {0}", InterfaceMatch.Value.ToString())); 
        string slotasstring = SlotNum.ToString(); 
        string portasstring = PortNum.ToString(); 
    // here is the line that writes what the slot and port values are 
       CiscoDecodeVariables.swlog.WriteLine(String.Format("Slot and Port are: {0}/{0}", slotasstring, portasstring)); 
       CiscoDecodeVariables.swlog.Flush(); 
        //sw.Close(); 
        currPort = ((PortModule)ModuleList[SlotNum]).FCPortList[PortNum - 1]; 
       } 

最後に、ここにStreamWriterのコードを示します。私は静的な変数で静的なクラスをdeclearedので、私は必要なStreamwriterを使用することができます。 文字列InterfaceMatchString = @ "(?\ D +)FC(?\ D +)が/である" 問題の正規表現のマッチパターンを追加

static public class CiscoDecodeVariables 
{ 
    static public string LogFileOutPutPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\\ciscodecodelog.txt"; 
    static public StreamWriter swlog = new StreamWriter(LogFileOutPutPath); 

} 

また、RegexExtensions.TryMatch()は、成功した一致に対してtrueを返し、InterfaceMatchインスタンスを結果に設定する静的メソッドです。

+0

これは、あなたがマッチを書き留めている行を止め、ウォッチウィンドウに 'InterfaceMatch.Value.ToString()'を置くと、swlogに書き込まれないものが出てくるということですあなたが期待するように?もしそうなら、それは変だから... – Chris

+0

はい。デバッガはよく見えます。上記の 'currPort'行は現在のポートを正しいポートに割り当てます。つまり、正規表現から解析したものと一致するスロットとポートを持つモジュールリストのポートです。私が考えることができるのはString.Format()がスロットとポートの値を使って何かをしているということだけです。 –

+0

Regex式と入力文字列を追加してください。ありがとう!また、SlotNumとPortNumはどんなタイプですか? –

答えて

1

フォーマット文字列に問題があります。

CiscoDecodeVariables.swlog.WriteLine(String.Format("Slot and Port are: {0}/{0}", slotasstring, portasstring)); 

は "{0}/{0}" あなたは結果 "slotasstring/slotasstring" ではなく "slotasstring/portasstring" を買ってあげることを意味します。

2

あなたのコード:

"Slot and Port are: {0}/{0}" 

正しいコード:それはのように見える

"Slot and Port are: {0}/{1}" 

簡単にタイプミスミス。 :)

最初の行を理解できない人は明示的に2回目(後続のパラメータの1番目)に同じことを明示していますが、2行目は最初のパラメータを入れてから2行目{0}と{1})。

String.Formatは任意のオブジェクトをとり、必要に応じてToStringを呼び出すので、最初に文字列に変換する必要はありません(ただし、これらの行はデバッグのヘルプ専用です)。また、私はValueがすでに文字列であるべきであると信じているInterfaceMatch.Value.ToString()があります。

+0

古典の​​1つです! Resharperはあなたのためにこれらのエラーをピックアップします:) – MattDavey

+0

String.Format()のヒントありがとうございます。私はそれがToString()を私のために実行するのか分からなかった。最初に文字列に変換する場合は、デバッグのためのものでした。そうすれば、値のRegExマッチを掘り下げる必要はありません(そして、intのToString()が私の期待することを確認するだけです) –

関連する問題