2

特定の文字列を抽出したいファイルを解析しています。

文字列の前にはある程度の長さの空白があり、その後に次のいずれかが続きます。

  • H の後に 8 つの 16 進数が続く

また

  • G の後に 9 つの 16 進数が続く

キャリッジ リターンと改行が続きます。

「文字が H の場合は 8 文字スキップ、G の場合は 9 文字スキップ」またはさらに単純に「文字が H の場合はスキップ8 文字、そうでない場合は 9 文字をスキップします。」

H でうまく機能する現在の正規表現は@"\s+H.{8}(? <user>.*)\r\n"ですが、条件付き文字数の追加に関しては困惑しています。たとえば、[H|G].{8|9} のような構文があればいいのですが、正規表現の構文には実際には存在しないと思います。

4

4 に答える 4

2

私は使用します:

\s+(?:H[a-fA-F0-9]{8}|G[a-fA-F0-9]{9})(?<user>.*)\r\n
于 2013-10-28T19:07:37.483 に答える
1

まあそれは可能Regexです。正規表現で条件を使用できます。

これが、苦労している「正規表現」の主要部分です。これでビルドできると思います。

var subject = "H12345678ABC";
var regex = new Regex(@"(?((?<hgroup>H))\k<hgroup>.{8}|.{10})(?<user>.*)");
var match =regex.Match(subject);
if(match.Success)
{
    Console.WriteLine(match.Groups["user"].Value);//prints ABC
}
else
{
    Console.WriteLine("No Match");
}

別れる:

(?<hgroup>H)    Matches H and stores in group hgroup
\k<hgroup>.{8}  If true checks matches H followed by any 8 characters
.{10}           If not then match next 10 characters(G followed by 9 other characters)
(?<user>.*)     Captures rest all to user group

ここに動作するデモがあります

于 2013-10-28T19:23:00.973 に答える
0

これは 2 つの if 条件を実行します。正規表現オプション IgnorePatternWhitespace を使用してコメントを許可する

(?(H0[xX][0-9a-fA-F]{6}[^\r\n\d]+)     # If an H with 8 hex digits is found
     H.{8}(?<User>[^\r\n\d]+)          # Then match the H user
    |                                  # else
    (?(G0[xX][0-9a-fA-F]{7}[^\r\n\d]+) # If G with 9 hex is found
      G.{9}(?<User>[^\r\n\d]+))        # Then match the G User
 )

アップデート

アキレスの癒しは、ユーザー名が何で構成されているかが不明であることです...ユーザー名に数字が含まれている場合1OmegaMan...これは失敗します。しかし、OPはそのルールを指定しておらず、明確な例も示していません.

したがって、ここでの前提は、ユーザー名がすべてアルファベット文字であるということです。

検索するより良いパターンH\d{8}[A-Z][^\r\n]+は、数字からユーザー名を区別する数字の後に少なくとも 1 つのアルファベット文字が存在することを示している可能性があります。

于 2013-10-28T19:35:04.520 に答える