0

I am trying to get parts from these strings: first:
2F4449534301224E4F204445534352495054494F4E20415641494C41424C45011F30303034342D30313230382D
second:
2F4449534301224E4F204445534352495054494F4E20415641494C41424C45011F30303130312D3032323534012630303130312D31303932342D

基本的に、両方の文字列を返したい: 最初:
2F(.+)011F(.+)2D
2番目:
2F(.+)011F(.+)0126(.+)2D

私はこのパターンを使用しようとしています:

Match m = Regex.Match(this.__line, 
                      @"^2F.*22(.*)011F(.*)(0126.*)?.{2}$", 
                      RegexOptions.IgnoreCase);

ただし、試してみると:

if (m.Success)
{
    if (m.Groups[3].Value != "")
    {
        Console.WriteLine("good");
    }
}
else
{
    Console.WriteLine("bad");
}

パターンに一致しないため、2 番目の文字列から「悪い」と表示されます。正しいパターンを使用していませんか?

4

3 に答える 3

1

問題は、パターンが貪欲であることです。代わりにこのパターンを使用する必要があります:

^2F.*22(.*?)011F(.*?)(0126.*?)?.{2}$

正規表現の 2 番目のグループは、貪欲であり、最後のグループはオプションであるため、最後の 2 文字まですべてに一致します。

一致を非貪欲にするには、 ? を使用します。数量詞の後。

貪欲と非貪欲の詳細については、こちらをご覧ください。

お役に立てれば。

于 2012-07-06T19:02:41.360 に答える
0

「^」を抜きます。

2F。22(. )011F(. )(0126. )?.{2}$

http://regexpal.com/は、私のお気に入りの正規表現ツールです。

于 2012-07-06T19:02:45.957 に答える
0

アドバイスをお願いします。これらはあなたの質問に対する答えではなく、いくつかの良い実践のヒントです:

  • 改行( . ) 以外の記号はパフォーマンスが非常に悪いため、可能な限り使用を避ける必要があります。ご覧のとおり、\Sに置き換えることができます
  • 大文字と小文字を区別しない一致の場合は、構文を使用します(?i:pattern)これにより、 RegexOptions.Compiledを選択するオプションが提供され、パフォーマンスが向上します
  • テキストを取得するには、名前付きキャプチャ グループを使用することをお勧めします。構文を使用します(?<name>pattern)。このようにして、次の方法で取得できますregexMatch.Groups["name"].Captures[0].Value
  • 取得したくないグループがある場合 (マッチング目的のみ)、次の構文を使用して、非キャプチャ グループとしてマークします。(?:pattern)
  • 最後に、RegexBuddyは優れた (まだ有料の) ツールです。強くお勧めします。

よろしく。

于 2012-07-06T19:15:25.900 に答える