0

すべてのドキュメントの上部にある著作権情報が正しくフォーマットされているかどうかを確認するために正規表現を作成しています。

著作権が長いので、私の正規表現も長いです。

著作権情報は次のようになっているとしましょう。

/*/////////////////////////////////////////////////////////////////////////

Copyright content which is a lot goes in here.

Programmer:  Tono Nam

/////////////////////////////////////////////////////////////////////////*/

次に、正規表現を使用します。

var pattern = 

@"/\*/////////////////////////////////////////////////////////////////////////

Copyright content which is a lot goes in here.

Programmer:  (?<ProgammerName>[\w '\.]+)

/////////////////////////////////////////////////////////////////////////\*/";

最初のテキストに正規表現を適用すると、すべてが素晴らしい一致が得られます。問題は、正規表現が一致しない場合です。プログラマーが一番上に余分なものを配置したとしましょう/。私の正規表現はもう一致しません。この例では、気付くのは簡単ですが、実際の著作権ははるかに長く、エラーがどこにあるかを知っておくと便利です。または、スペルミスがある場合もあります。たとえば、ProgrammerではなくProgramerに遭遇する可能性があります。そのため、私は著作権全体を調べて、エラーを発見する必要があります。必要なことをもっと簡単に行う方法があるはずだと思います


編集

件名がたまたま次の場合:

/ * //////////////////////////////////////////////// /////////////////////////

ここSOME_MISPELED_WORDにはたくさんの著作権コンテンツが入っています。

プログラマー:遠野ナム

////////////////////////////////////////////////// /////////////////////// * /

その場合、次の理由で正規表現が一致しません。SOME_MISPELED_WORDしたがって、エラーが発生したインデックスを知りたいので、次のことを確認できます。

/ * //////////////////////////////////////////////// /////////////////////////

ここにはたくさんの著作権コンテンツが入っています<--------------ここに

全部ではなく。


別の例は、著作権情報が次の場合です。

/ * //////////////////////////////////////////////// /////////////////////////

ここにはたくさんの著作権コンテンツが入っています。

プログラマー:遠野ナム

////////////////////////////////////////////////// //////////////////////// * /

余分ながありますので、最後の行でエラーが発生します/

4

3 に答える 3

0

上記のように正規表現を使用するのは厳しすぎると思います。次のようなものを試してください。

@"^/\*(/*)(.*)(Programmer:|Programer:){1}(\d*)(<ProgrammerName>){1}(/*)\*/$"

これにより、コメントブロック内にいることが確認され、開始と終了に任意の数のスラッシュを含めることができ、プログラマーが自分の名前に正しく署名していることを確認しながら、著作権ステートメントを入力する機能が制限されません。正直なところ、正規表現でプログラマー名を強制しようとすると、長期的に見た場合よりも面倒になると思います。それを引き出して、プログラマーの「セクション」がそこにあるかどうかを確認することをお勧めします。

于 2012-07-30T20:48:29.073 に答える
0

最後に私は解決策を持っています:

基本的に、正規表現が失敗する場所を知りたいのです。変更されない文字列が必要な場合は、それらを比較して、異なる文字を確認できます。言い換えれば、私がどこにいるのか:

var a = "12345";
var b = "1234A";

違いが出るまで、それからと比較することができa[0]ます。b[0]a[1]b[1]

だからやってみましょう!

私たちの著作権は次のようになっている必要があるとしましょう。

/*/////

Copyright content which is a lot goes in here.

Programmer:Tono Nam

Description:This is the description of the file....

/////*/

最初の例を適用できるように、変化する可能性のあるものをすべて削除しましょう。

/*/////

Copyright content which is a lot goes in here.

Programmer:

Description:

/////*/

次に、複雑なのは、最終的にその文字列になるために変化する可能性のあるすべてのものを削除する正規表現を作成することだけです。そのパターンは次のようになります:

 var regexPattern = @"(?s)(/\*/*.+Programmer:)(?<name>[^\r\n]*?)(\r.*Description:)(?<desc>[^\r\n]*)(\r.*?/*\*/)";

そのパターンで、私たちは向きを変えることができます:

/*/////

Copyright content which is a lot goes in here.

Programmer:Tono Nam bla bla bla

Description:THIS IS A DIFFERENT DESCRIPTION

/////*/

の中へ

/*/////

Copyright content which is a lot goes in here.

Programmer:

Description:

/////*/

これで、比較する2つの文字列ができました。




これが私が今説明したもののコードです

// the subject we want to test
            var subject =
@"/*/////

Copyright content which is a lot goes in here.

Programmer:Tono Nam

Description:This is the description of the file....

/////*/";

            // the actual pattern this should be a readonly constant type on a real program cause it never should change
            var pattern =
@"/*/////

Copyright content which is a lot goes in here.

Programmer:

Description:

/////*/";

            // we use this pattern to turn the first subject into the second if we can
            var regexPattern = @"(?s)(/\*/*.+Programmer:)(?<name>[^\r\n]*?)(\r.*Description:)(?<desc>[^\r\n]*)(\r.*?/*\*/)";

            // note $1 means group 1 so here we are basically removing the groups name and desc
            var newSubject = Regex.Replace(subject, regexPattern, "$1$2$3");

            // at this point if newSubject = pattern we know that the header is formatted correctly!

            // Let's see where they are different!
            for (int i = 0; i < pattern.Length; i++)
            {
                if (pattern[i] != newSubject[i])
                {
                    throw new Exception("There is a problem at index " + i);
                }
            }

この例では、件名が正しくフォーマットされているため、機能するはずです。しかし、私が物乞いに余分な/を置くと、何が起こるかを見てください:(私は6/文字を強調しました5があったはずです

ここに画像の説明を入力してください

于 2012-07-30T21:39:07.787 に答える
0

これを試してくださいRegex

/\*/{2,}(?:\n|.)*(?:Programm?er\s*:\s*(?<programmer>.+))[\n\r\s]*(?:Description\s*:\s*(?<description>.+))?

とという名前のグループを取得programmerdescriptionます。これは、上記のすべての条件で機能します。

于 2012-07-31T06:19:57.357 に答える